@agentrix/cli 0.3.3 → 0.3.6

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/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var yargs=require("yargs"),helpers=require("yargs/helpers"),chalk=require("chalk"),shared=require("@agentrix/shared"),node_crypto=require("node:crypto"),axios=require("axios"),_package=require("./logger-CRZgrMLn.cjs"),node_readline=require("node:readline"),fs=require("fs"),path=require("path"),os=require("node:os"),open=require("open"),socket_ioClient=require("socket.io-client"),node_events=require("node:events"),fs$1=require("node:fs"),path$1=require("node:path"),node_module=require("node:module"),child_process=require("child_process"),psList=require("ps-list"),spawn=require("cross-spawn"),platform_js=require("@xmz-ai/sandbox-runtime/dist/utils/platform.js"),fastify=require("fastify"),zod=require("zod"),fastifyTypeProviderZod=require("fastify-type-provider-zod"),node_child_process=require("node:child_process"),events=require("events"),Database=require("better-sqlite3"),url=require("url"),sandboxRuntime=require("@xmz-ai/sandbox-runtime"),promises=require("node:stream/promises"),claudeAgentSdk=require("@anthropic-ai/claude-agent-sdk"),simpleGit=require("simple-git"),node_util=require("node:util"),promises$1=require("node:fs/promises"),crypto$1=require("crypto"),codexSdk=require("@openai/codex-sdk");require("winston"),require("os");var _documentCurrentScript="undefined"!=typeof document?document.currentScript:null;function _interopNamespaceDefault(e){var a=Object.create(null);return e&&Object.keys(e).forEach(function(n){if("default"!==n){var t=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(a,n,t.get?t:{enumerable:!0,get:function(){return e[n]}})}}),a.default=e,Object.freeze(a)}var fs__namespace$1=_interopNamespaceDefault(fs),path__namespace$1=_interopNamespaceDefault(path),fs__namespace=_interopNamespaceDefault(fs$1),path__namespace=_interopNamespaceDefault(path$1);async function delay(e){return new Promise(a=>setTimeout(a,e))}async function daemonPost(e,a){const n=await _package.machine.readDaemonState();if(!n?.port){const e="No daemon running, no state file found";return _package.logger.debug(`[CONTROL CLIENT] ${e}`),{error:e}}try{const t=process.env.AGENTRIX_DAEMON_HTTP_TIMEOUT?parseInt(process.env.AGENTRIX_DAEMON_HTTP_TIMEOUT):1e4,s=await fetch(`http://agentrix-local.xmz.ai:${n.port}${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a||{}),signal:AbortSignal.timeout(t)});if(!s.ok){const a=`Request failed: ${e}, HTTP ${s.status}`;return _package.logger.debug(`[CONTROL CLIENT] ${a}`),{error:a}}return await s.json()}catch(a){const n=`Request failed: ${e}, ${a instanceof Error?a.message:"Unknown error"}`;return _package.logger.debug(`[CONTROL CLIENT] ${n}`),{error:n}}}async function notifyDaemonSessionStarted(e,a){return await daemonPost("/session-started",{sessionId:e,metadata:a})}async function listDaemonSessions(){return(await daemonPost("/list")).children||[]}async function stopDaemonSession(e){return(await daemonPost("/stop-session",{sessionId:e})).success||!1}async function stopDaemonHttp(){await daemonPost("/stop")}async function checkIfDaemonRunningAndCleanupStaleState(){const e=await _package.machine.readDaemonState();if(!e)return!1;try{return process.kill(e.pid,0),!0}catch{return _package.logger.debug("[DAEMON RUN] Daemon PID not running, cleaning up state"),await cleanupDaemonState(),!1}}async function isLatestDaemonRunning(){if(_package.logger.debug("[DAEMON CONTROL] Checking if daemon is running same version"),!await checkIfDaemonRunningAndCleanupStaleState())return _package.logger.debug("[DAEMON CONTROL] No daemon running, returning false"),!1;const e=await _package.machine.readDaemonState();if(!e)return _package.logger.debug("[DAEMON CONTROL] No daemon state found, returning false"),!1;try{const a=path.join(_package.projectPath(),"package.json"),n=JSON.parse(fs.readFileSync(a,"utf-8")).version;return _package.logger.debug(`[DAEMON CONTROL] Current CLI version: ${n}, Daemon started with version: ${e.cliVersion}`),n===e.cliVersion}catch(e){return _package.logger.debug("[DAEMON CONTROL] Error checking daemon version",e),!1}}async function cleanupDaemonState(){try{await _package.machine.clearDaemonState(),_package.logger.debug("[DAEMON RUN] Daemon state file removed")}catch(e){_package.logger.debug("[DAEMON RUN] Error cleaning up daemon metadata",e)}}async function stopDaemon(){try{const e=await _package.machine.readDaemonState();if(!e)return void _package.logger.debug("No daemon state found");_package.logger.debug(`Stopping daemon with PID ${e.pid}`);try{return await stopDaemonHttp(),void await waitForProcessDeath(e.pid,2e3)}catch(e){_package.logger.debug("HTTP stop failed, will force kill",e)}process.kill(e.pid,"SIGKILL")}catch(e){_package.logger.debug("Error stopping daemon",e)}}async function waitForProcessDeath(e,a){const n=Date.now();for(;Date.now()-n<a;)try{process.kill(e,0),await new Promise(e=>setTimeout(e,100))}catch{return}throw new Error("Process did not die within timeout")}function generateWebAuthUrl(e,a){const n={key:shared.encodeBase64(e,"base64"),machineId:a},t=JSON.stringify(n),s=shared.encodeBase64((new TextEncoder).encode(t),"base64url");return`${_package.machine.webappUrl}/terminal/connect?auth=${s}`}async function handleAuthLogout(){if(!await _package.machine.readCredentials())return void console.log(chalk.yellow("Not currently authenticated"));console.log(chalk.blue("This will log you out of Agentrix")),console.log(chalk.yellow("⚠️ You will need to re-authenticate to use Agentrix again"));const e=node_readline.createInterface({input:process.stdin,output:process.stdout}),a=await new Promise(a=>{e.question(chalk.yellow("Are you sure you want to log out? (y/N): "),a)});if(e.close(),"y"===a.toLowerCase()||"yes"===a.toLowerCase())try{try{await stopDaemon(),console.log(chalk.gray("Stopped daemon"))}catch{}await _package.machine.clearCredentials(),console.log(chalk.gray("Removed credentials")),console.log(chalk.green("✓ Successfully logged out"))}catch(e){throw new Error(`Failed to logout: ${e instanceof Error?e.message:"Unknown error"}`)}else console.log(chalk.blue("Logout cancelled"))}async function handleAuthStatus(){const e=await _package.machine.readCredentials();if(console.log(chalk.bold("\nAuthentication Status\n")),!e)return void console.log(chalk.red("✗ Not authenticated"));console.log(chalk.green("✓ Authenticated"));const a=e.token.substring(0,30)+"...";console.log(chalk.gray(` Token: ${a}`)),e.machineId?(console.log(chalk.green("✓ Machine registered")),console.log(chalk.gray(` Machine ID: ${e.machineId}`)),console.log(chalk.gray(` Host: ${os.hostname()}`))):console.log(chalk.yellow("⚠️ Machine not registered")),console.log(chalk.gray(`\n Data directory: ${_package.machine.agentrixHomeDir}`));try{await checkIfDaemonRunningAndCleanupStaleState()?console.log(chalk.green("✓ Daemon running")):console.log(chalk.gray("✗ Daemon not running"))}catch{console.log(chalk.gray("✗ Daemon not running"))}}async function openBrowser(e){try{return!process.stdout.isTTY||process.env.CI||process.env.HEADLESS?(_package.logger.debug("[browser] Headless environment detected, skipping browser open"),!1):(_package.logger.debug(`[browser] Attempting to open URL: ${e}`),await open(e),_package.logger.debug("[browser] Browser opened successfully"),!0)}catch(e){return _package.logger.debug("[browser] Failed to open browser:",e),!1}}async function doAuth(){console.clear();const e=_package.machine.generateMachineId(),a=new Uint8Array(node_crypto.randomBytes(32)),n=await shared.createKeyPairWithUit8Array(a);try{console.log(`[AUTH] Sending auth request to: ${_package.machine.serverUrl}/v1/auth/machine`),console.log(`[AUTH] Public key: ${shared.encodeBase64(n.publicKey).substring(0,20)}...`);const a={machineId:e};await axios.post(`${_package.machine.serverUrl}/v1/auth/machine`,a),console.log("[AUTH] Auth request sent successfully")}catch(e){return console.log("Failed to create authentication request, please try again later."),{credentials:null,userPublicKey:null,keypair:n}}const t=await doWebAuth(n,e);return t.token?{credentials:{token:t.token,secret:shared.encodeBase64(a),machineId:e},userPublicKey:t?.userPublicKey,keypair:n}:{credentials:null,userPublicKey:null,keypair:n}}async function doWebAuth(e,a){console.clear(),console.log("\nWeb Authentication\n");const n=generateWebAuthUrl(e.publicKey,a);return console.log("Opening your browser..."),await openBrowser(n)?(console.log("✓ Browser opened\n"),console.log("Complete authentication in your browser window.")):console.log("Could not open browser automatically."),console.log("\nIf the browser did not open, please copy and paste this URL:"),console.log(n),console.log(""),await waitForAuthentication(e,a)}async function waitForAuthentication(e,a){process.stdout.write("Waiting for authentication");let n=0,t=!1;const s=()=>{t=!0,console.log("\n\nAuthentication cancelled."),process.exit(0)};process.on("SIGINT",s);try{for(;!t;){try{const n=await axios.get(`${_package.machine.serverUrl}/v1/auth/machine?machineId=${a}`);if("authorized"===n.data.state){const a=n.data.token,t=n.data.content,s=shared.decryptWithEphemeralKey(shared.decodeBase64(t),e.secretKey);return s?{token:a,userPublicKey:JSON.parse((new TextDecoder).decode(s)).publicKey}:(console.log("\n\nFailed to decrypt authentication data. Please try again."),{token:null,userPublicKey:null})}}catch(e){return console.log("\n\nFailed to check authentication status. Please try again."),{token:null,userPublicKey:null}}process.stdout.write("\rWaiting for authentication"+".".repeat(n%3+1)+" "),n++,await delay(1e3)}}finally{process.off("SIGINT",s)}return{token:null,userPublicKey:null}}async function syncMachine(e,a,n,t){try{const s={id:e.machineId,metadata:JSON.stringify(a)};t&&n&&(s.dataEncryptionKey=shared.encryptMachineEncryptionKey(t.publicKey,shared.generateAESKey(),shared.decodeBase64(n))),await axios.post(`${_package.machine.serverUrl}/v1/machines/sync`,s,{headers:{Authorization:`Bearer ${e.token}`,"Content-Type":"application/json"},timeout:6e4})}catch(e){if(axios.isAxiosError(e))throw new Error(`Failed to sync machine data: ${e.response?.data?.message||e.message}`);throw e}}async function authAndSetupMachineIfNeeded(){const e=await _package.machine.readCredentials();if(e)return _package.logger.info("[AUTH] Using existing credentials"),e;const a=process.env.CLOUD_AUTH_TOKEN,n=process.env.CLOUD_DEVICE;let t,s,i;if(a&&n)t={token:a,machineId:n},_package.logger.info("[AUTH] Cloud mode detected, using CLOUD_AUTH_TOKEN");else{const e=await doAuth();if(!e.credentials||!e.userPublicKey)throw new Error("Authentication failed or was cancelled");t=e.credentials,s=e.keypair,i=e.userPublicKey}return await _package.machine.writeCredentials(t),await syncMachine(t,_package.machine.metadata(),i,s),_package.logger.info("[AUTH] Machine setup completed"),t}class KeepAliveManager{interval=null;socket=null;config;constructor(e){this.config=e}start(e){this.interval&&this.stop(),this.socket=e,this.interval=setInterval(()=>{if(!this.socket)return void this.stop();const e=this.config.payloadGenerator?this.config.payloadGenerator():{};this.socket.emit(this.config.event,e)},this.config.intervalMs)}stop(){this.interval&&(clearInterval(this.interval),this.interval=null),this.socket=null}isRunning(){return null!==this.interval}}class SocketClient{socket=null;config;eventHandlers=new Map;eventEmitter=new node_events.EventEmitter;KeepAliveManager=null;healthCheckInterval=null;constructor(e){this.config=e,e.keepAliveConfig&&(this.KeepAliveManager=new KeepAliveManager(e.keepAliveConfig))}connect(){if(this.socket)return void this.log("Already connected or connecting");const{serverUrl:e,path:a,auth:n={},options:t={}}=this.config,s={path:a,auth:n,transports:["websocket"],reconnection:!0,reconnectionDelay:1e3,reconnectionDelayMax:5e3,reconnectionAttempts:1/0,...t};this.socket=socket_ioClient.io(e,s),this.setupSocketHandlers(),this.log("Connecting to",e)}disconnect(){this.socket&&(this.log("Disconnecting"),this.stopHealthCheck(),this.socket.close(),this.socket=null)}get connected(){return this.socket?.connected??!1}replaceSocketHandler(e,a,n){this.socket&&(a&&this.socket.off(e,a),this.socket.on(e,n))}onEvent(e,a){const n=async n=>(this.log(`received event ${e}, data: ${JSON.stringify(n)}`),a(n)),t=this.eventHandlers.get(e);this.eventHandlers.set(e,n),this.replaceSocketHandler(e,t,n)}onEventWithAck(e,a){const n=async(n,t)=>(this.log(`received event with ack ${e}, data: ${JSON.stringify(n)}`),a(n,t)),t=this.eventHandlers.get(e);this.eventHandlers.set(e,n),this.replaceSocketHandler(e,t,n)}unregisterHandler(e){this.eventHandlers.delete(e),this.socket&&this.socket.off(e)}send(e,a){this.socket?(this.log(`send event ${e}`),void 0!==a?this.socket.emit(e,a):this.socket.emit(e)):this.log("Cannot send - socket not connected")}async sendWithAck(e,a){if(!this.socket)throw new Error("Cannot send - socket not connected");return this.log(`send event ${e}, data: ${JSON.stringify(a)}`),this.socket.emitWithAck(e,a)}sendVolatile(e,a){this.socket&&(void 0!==a?this.socket.volatile.emit(e,a):this.socket.volatile.emit(e))}async flush(e=1e4){if(this.connected)return new Promise(a=>{const n=setTimeout(()=>a(),e);this.socket.emit("ping",()=>{clearTimeout(n),a()})})}updateAuth(e){this.socket&&(this.socket.auth=e),this.config.auth=e}onLifecycle(e,a){this.eventEmitter.on(`lifecycle:${e}`,a)}offLifecycle(e){this.eventEmitter.removeAllListeners(`lifecycle:${e}`)}setupSocketHandlers(){this.socket&&(this.socket.on("connect",()=>{this.log("Connected"),this.eventEmitter.emit("lifecycle:connect",this.socket);for(const[e,a]of this.eventHandlers.entries())this.socket.off(e,a),this.socket.on(e,a);this.KeepAliveManager?.start(this.socket),this.startHealthCheck()}),this.socket.on("disconnect",e=>{this.log("Disconnected:",e),this.eventEmitter.emit("lifecycle:disconnect",e),this.KeepAliveManager?.stop(),this.stopHealthCheck()}),this.socket.on("connect_error",e=>{this.log("Connection error:",e.message),this.eventEmitter.emit("lifecycle:connect_error",e),setTimeout(()=>this.socket?.connect(),5e3)}),this.socket.on("error",e=>{this.log("Socket error:",e),this.eventEmitter.emit("lifecycle:error",e)}))}startHealthCheck(){const e=this.config.healthCheckConfig;if(!1===e?.enabled)return;const a=e?.intervalMs??3e4,n=e?.timeoutMs??5e3;this.stopHealthCheck(),this.healthCheckInterval=setInterval(()=>{if(!this.socket||!this.connected)return;const e=setTimeout(()=>{this.log("Health check timeout - forcing reconnect"),this.socket&&(this.socket.disconnect(),this.socket.connect())},n);this.socket.once("pong",()=>{clearTimeout(e)}),this.socket.emit("ping")},a)}stopHealthCheck(){this.healthCheckInterval&&(clearInterval(this.healthCheckInterval),this.healthCheckInterval=null)}log(e,...a){this.config.logger&&this.config.logger(`[SocketClient] ${e}`,...a)}}function getAugmentedNamespace(e){if(Object.prototype.hasOwnProperty.call(e,"__esModule"))return e;var a=e.default;if("function"==typeof a){var n=function e(){var n=!1;try{n=this instanceof e}catch{}return n?Reflect.construct(a,arguments,this.constructor):a.apply(this,arguments)};n.prototype=a.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(e).forEach(function(a){var t=Object.getOwnPropertyDescriptor(e,a);Object.defineProperty(n,a,t.get?t:{enumerable:!0,get:function(){return e[a]}})}),n}var mimeDb,hasRequiredMimeDb,mimeScore,hasRequiredMimeScore,hasRequiredMimeTypes,mimeTypes={},require$$0$1={"application/1d-interleaved-parityfec":{source:"iana"},"application/3gpdash-qoe-report+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/3gpp-ims+xml":{source:"iana",compressible:!0},"application/3gpphal+json":{source:"iana",compressible:!0},"application/3gpphalforms+json":{source:"iana",compressible:!0},"application/a2l":{source:"iana"},"application/ace+cbor":{source:"iana"},"application/ace+json":{source:"iana",compressible:!0},"application/ace-groupcomm+cbor":{source:"iana"},"application/ace-trl+cbor":{source:"iana"},"application/activemessage":{source:"iana"},"application/activity+json":{source:"iana",compressible:!0},"application/aif+cbor":{source:"iana"},"application/aif+json":{source:"iana",compressible:!0},"application/alto-cdni+json":{source:"iana",compressible:!0},"application/alto-cdnifilter+json":{source:"iana",compressible:!0},"application/alto-costmap+json":{source:"iana",compressible:!0},"application/alto-costmapfilter+json":{source:"iana",compressible:!0},"application/alto-directory+json":{source:"iana",compressible:!0},"application/alto-endpointcost+json":{source:"iana",compressible:!0},"application/alto-endpointcostparams+json":{source:"iana",compressible:!0},"application/alto-endpointprop+json":{source:"iana",compressible:!0},"application/alto-endpointpropparams+json":{source:"iana",compressible:!0},"application/alto-error+json":{source:"iana",compressible:!0},"application/alto-networkmap+json":{source:"iana",compressible:!0},"application/alto-networkmapfilter+json":{source:"iana",compressible:!0},"application/alto-propmap+json":{source:"iana",compressible:!0},"application/alto-propmapparams+json":{source:"iana",compressible:!0},"application/alto-tips+json":{source:"iana",compressible:!0},"application/alto-tipsparams+json":{source:"iana",compressible:!0},"application/alto-updatestreamcontrol+json":{source:"iana",compressible:!0},"application/alto-updatestreamparams+json":{source:"iana",compressible:!0},"application/aml":{source:"iana"},"application/andrew-inset":{source:"iana",extensions:["ez"]},"application/appinstaller":{compressible:!1,extensions:["appinstaller"]},"application/applefile":{source:"iana"},"application/applixware":{source:"apache",extensions:["aw"]},"application/appx":{compressible:!1,extensions:["appx"]},"application/appxbundle":{compressible:!1,extensions:["appxbundle"]},"application/at+jwt":{source:"iana"},"application/atf":{source:"iana"},"application/atfx":{source:"iana"},"application/atom+xml":{source:"iana",compressible:!0,extensions:["atom"]},"application/atomcat+xml":{source:"iana",compressible:!0,extensions:["atomcat"]},"application/atomdeleted+xml":{source:"iana",compressible:!0,extensions:["atomdeleted"]},"application/atomicmail":{source:"iana"},"application/atomsvc+xml":{source:"iana",compressible:!0,extensions:["atomsvc"]},"application/atsc-dwd+xml":{source:"iana",compressible:!0,extensions:["dwd"]},"application/atsc-dynamic-event-message":{source:"iana"},"application/atsc-held+xml":{source:"iana",compressible:!0,extensions:["held"]},"application/atsc-rdt+json":{source:"iana",compressible:!0},"application/atsc-rsat+xml":{source:"iana",compressible:!0,extensions:["rsat"]},"application/atxml":{source:"iana"},"application/auth-policy+xml":{source:"iana",compressible:!0},"application/automationml-aml+xml":{source:"iana",compressible:!0,extensions:["aml"]},"application/automationml-amlx+zip":{source:"iana",compressible:!1,extensions:["amlx"]},"application/bacnet-xdd+zip":{source:"iana",compressible:!1},"application/batch-smtp":{source:"iana"},"application/bdoc":{compressible:!1,extensions:["bdoc"]},"application/beep+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/bufr":{source:"iana"},"application/c2pa":{source:"iana"},"application/calendar+json":{source:"iana",compressible:!0},"application/calendar+xml":{source:"iana",compressible:!0,extensions:["xcs"]},"application/call-completion":{source:"iana"},"application/cals-1840":{source:"iana"},"application/captive+json":{source:"iana",compressible:!0},"application/cbor":{source:"iana"},"application/cbor-seq":{source:"iana"},"application/cccex":{source:"iana"},"application/ccmp+xml":{source:"iana",compressible:!0},"application/ccxml+xml":{source:"iana",compressible:!0,extensions:["ccxml"]},"application/cda+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/cdfx+xml":{source:"iana",compressible:!0,extensions:["cdfx"]},"application/cdmi-capability":{source:"iana",extensions:["cdmia"]},"application/cdmi-container":{source:"iana",extensions:["cdmic"]},"application/cdmi-domain":{source:"iana",extensions:["cdmid"]},"application/cdmi-object":{source:"iana",extensions:["cdmio"]},"application/cdmi-queue":{source:"iana",extensions:["cdmiq"]},"application/cdni":{source:"iana"},"application/ce+cbor":{source:"iana"},"application/cea":{source:"iana"},"application/cea-2018+xml":{source:"iana",compressible:!0},"application/cellml+xml":{source:"iana",compressible:!0},"application/cfw":{source:"iana"},"application/cid-edhoc+cbor-seq":{source:"iana"},"application/city+json":{source:"iana",compressible:!0},"application/city+json-seq":{source:"iana"},"application/clr":{source:"iana"},"application/clue+xml":{source:"iana",compressible:!0},"application/clue_info+xml":{source:"iana",compressible:!0},"application/cms":{source:"iana"},"application/cnrp+xml":{source:"iana",compressible:!0},"application/coap-eap":{source:"iana"},"application/coap-group+json":{source:"iana",compressible:!0},"application/coap-payload":{source:"iana"},"application/commonground":{source:"iana"},"application/concise-problem-details+cbor":{source:"iana"},"application/conference-info+xml":{source:"iana",compressible:!0},"application/cose":{source:"iana"},"application/cose-key":{source:"iana"},"application/cose-key-set":{source:"iana"},"application/cose-x509":{source:"iana"},"application/cpl+xml":{source:"iana",compressible:!0,extensions:["cpl"]},"application/csrattrs":{source:"iana"},"application/csta+xml":{source:"iana",compressible:!0},"application/cstadata+xml":{source:"iana",compressible:!0},"application/csvm+json":{source:"iana",compressible:!0},"application/cu-seeme":{source:"apache",extensions:["cu"]},"application/cwl":{source:"iana",extensions:["cwl"]},"application/cwl+json":{source:"iana",compressible:!0},"application/cwl+yaml":{source:"iana"},"application/cwt":{source:"iana"},"application/cybercash":{source:"iana"},"application/dart":{compressible:!0},"application/dash+xml":{source:"iana",compressible:!0,extensions:["mpd"]},"application/dash-patch+xml":{source:"iana",compressible:!0,extensions:["mpp"]},"application/dashdelta":{source:"iana"},"application/davmount+xml":{source:"iana",compressible:!0,extensions:["davmount"]},"application/dca-rft":{source:"iana"},"application/dcd":{source:"iana"},"application/dec-dx":{source:"iana"},"application/dialog-info+xml":{source:"iana",compressible:!0},"application/dicom":{source:"iana",extensions:["dcm"]},"application/dicom+json":{source:"iana",compressible:!0},"application/dicom+xml":{source:"iana",compressible:!0},"application/dii":{source:"iana"},"application/dit":{source:"iana"},"application/dns":{source:"iana"},"application/dns+json":{source:"iana",compressible:!0},"application/dns-message":{source:"iana"},"application/docbook+xml":{source:"apache",compressible:!0,extensions:["dbk"]},"application/dots+cbor":{source:"iana"},"application/dpop+jwt":{source:"iana"},"application/dskpp+xml":{source:"iana",compressible:!0},"application/dssc+der":{source:"iana",extensions:["dssc"]},"application/dssc+xml":{source:"iana",compressible:!0,extensions:["xdssc"]},"application/dvcs":{source:"iana"},"application/eat+cwt":{source:"iana"},"application/eat+jwt":{source:"iana"},"application/eat-bun+cbor":{source:"iana"},"application/eat-bun+json":{source:"iana",compressible:!0},"application/eat-ucs+cbor":{source:"iana"},"application/eat-ucs+json":{source:"iana",compressible:!0},"application/ecmascript":{source:"apache",compressible:!0,extensions:["ecma"]},"application/edhoc+cbor-seq":{source:"iana"},"application/edi-consent":{source:"iana"},"application/edi-x12":{source:"iana",compressible:!1},"application/edifact":{source:"iana",compressible:!1},"application/efi":{source:"iana"},"application/elm+json":{source:"iana",charset:"UTF-8",compressible:!0},"application/elm+xml":{source:"iana",compressible:!0},"application/emergencycalldata.cap+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/emergencycalldata.comment+xml":{source:"iana",compressible:!0},"application/emergencycalldata.control+xml":{source:"iana",compressible:!0},"application/emergencycalldata.deviceinfo+xml":{source:"iana",compressible:!0},"application/emergencycalldata.ecall.msd":{source:"iana"},"application/emergencycalldata.legacyesn+json":{source:"iana",compressible:!0},"application/emergencycalldata.providerinfo+xml":{source:"iana",compressible:!0},"application/emergencycalldata.serviceinfo+xml":{source:"iana",compressible:!0},"application/emergencycalldata.subscriberinfo+xml":{source:"iana",compressible:!0},"application/emergencycalldata.veds+xml":{source:"iana",compressible:!0},"application/emma+xml":{source:"iana",compressible:!0,extensions:["emma"]},"application/emotionml+xml":{source:"iana",compressible:!0,extensions:["emotionml"]},"application/encaprtp":{source:"iana"},"application/entity-statement+jwt":{source:"iana"},"application/epp+xml":{source:"iana",compressible:!0},"application/epub+zip":{source:"iana",compressible:!1,extensions:["epub"]},"application/eshop":{source:"iana"},"application/exi":{source:"iana",extensions:["exi"]},"application/expect-ct-report+json":{source:"iana",compressible:!0},"application/express":{source:"iana",extensions:["exp"]},"application/fastinfoset":{source:"iana"},"application/fastsoap":{source:"iana"},"application/fdf":{source:"iana",extensions:["fdf"]},"application/fdt+xml":{source:"iana",compressible:!0,extensions:["fdt"]},"application/fhir+json":{source:"iana",charset:"UTF-8",compressible:!0},"application/fhir+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/fido.trusted-apps+json":{compressible:!0},"application/fits":{source:"iana"},"application/flexfec":{source:"iana"},"application/font-sfnt":{source:"iana"},"application/font-tdpfr":{source:"iana",extensions:["pfr"]},"application/font-woff":{source:"iana",compressible:!1},"application/framework-attributes+xml":{source:"iana",compressible:!0},"application/geo+json":{source:"iana",compressible:!0,extensions:["geojson"]},"application/geo+json-seq":{source:"iana"},"application/geopackage+sqlite3":{source:"iana"},"application/geopose+json":{source:"iana",compressible:!0},"application/geoxacml+json":{source:"iana",compressible:!0},"application/geoxacml+xml":{source:"iana",compressible:!0},"application/gltf-buffer":{source:"iana"},"application/gml+xml":{source:"iana",compressible:!0,extensions:["gml"]},"application/gnap-binding-jws":{source:"iana"},"application/gnap-binding-jwsd":{source:"iana"},"application/gnap-binding-rotation-jws":{source:"iana"},"application/gnap-binding-rotation-jwsd":{source:"iana"},"application/gpx+xml":{source:"apache",compressible:!0,extensions:["gpx"]},"application/grib":{source:"iana"},"application/gxf":{source:"apache",extensions:["gxf"]},"application/gzip":{source:"iana",compressible:!1,extensions:["gz"]},"application/h224":{source:"iana"},"application/held+xml":{source:"iana",compressible:!0},"application/hjson":{extensions:["hjson"]},"application/hl7v2+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/http":{source:"iana"},"application/hyperstudio":{source:"iana",extensions:["stk"]},"application/ibe-key-request+xml":{source:"iana",compressible:!0},"application/ibe-pkg-reply+xml":{source:"iana",compressible:!0},"application/ibe-pp-data":{source:"iana"},"application/iges":{source:"iana"},"application/im-iscomposing+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/index":{source:"iana"},"application/index.cmd":{source:"iana"},"application/index.obj":{source:"iana"},"application/index.response":{source:"iana"},"application/index.vnd":{source:"iana"},"application/inkml+xml":{source:"iana",compressible:!0,extensions:["ink","inkml"]},"application/iotp":{source:"iana"},"application/ipfix":{source:"iana",extensions:["ipfix"]},"application/ipp":{source:"iana"},"application/isup":{source:"iana"},"application/its+xml":{source:"iana",compressible:!0,extensions:["its"]},"application/java-archive":{source:"iana",compressible:!1,extensions:["jar","war","ear"]},"application/java-serialized-object":{source:"apache",compressible:!1,extensions:["ser"]},"application/java-vm":{source:"apache",compressible:!1,extensions:["class"]},"application/javascript":{source:"apache",charset:"UTF-8",compressible:!0,extensions:["js"]},"application/jf2feed+json":{source:"iana",compressible:!0},"application/jose":{source:"iana"},"application/jose+json":{source:"iana",compressible:!0},"application/jrd+json":{source:"iana",compressible:!0},"application/jscalendar+json":{source:"iana",compressible:!0},"application/jscontact+json":{source:"iana",compressible:!0},"application/json":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["json","map"]},"application/json-patch+json":{source:"iana",compressible:!0},"application/json-seq":{source:"iana"},"application/json5":{extensions:["json5"]},"application/jsonml+json":{source:"apache",compressible:!0,extensions:["jsonml"]},"application/jsonpath":{source:"iana"},"application/jwk+json":{source:"iana",compressible:!0},"application/jwk-set+json":{source:"iana",compressible:!0},"application/jwk-set+jwt":{source:"iana"},"application/jwt":{source:"iana"},"application/kpml-request+xml":{source:"iana",compressible:!0},"application/kpml-response+xml":{source:"iana",compressible:!0},"application/ld+json":{source:"iana",compressible:!0,extensions:["jsonld"]},"application/lgr+xml":{source:"iana",compressible:!0,extensions:["lgr"]},"application/link-format":{source:"iana"},"application/linkset":{source:"iana"},"application/linkset+json":{source:"iana",compressible:!0},"application/load-control+xml":{source:"iana",compressible:!0},"application/logout+jwt":{source:"iana"},"application/lost+xml":{source:"iana",compressible:!0,extensions:["lostxml"]},"application/lostsync+xml":{source:"iana",compressible:!0},"application/lpf+zip":{source:"iana",compressible:!1},"application/lxf":{source:"iana"},"application/mac-binhex40":{source:"iana",extensions:["hqx"]},"application/mac-compactpro":{source:"apache",extensions:["cpt"]},"application/macwriteii":{source:"iana"},"application/mads+xml":{source:"iana",compressible:!0,extensions:["mads"]},"application/manifest+json":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["webmanifest"]},"application/marc":{source:"iana",extensions:["mrc"]},"application/marcxml+xml":{source:"iana",compressible:!0,extensions:["mrcx"]},"application/mathematica":{source:"iana",extensions:["ma","nb","mb"]},"application/mathml+xml":{source:"iana",compressible:!0,extensions:["mathml"]},"application/mathml-content+xml":{source:"iana",compressible:!0},"application/mathml-presentation+xml":{source:"iana",compressible:!0},"application/mbms-associated-procedure-description+xml":{source:"iana",compressible:!0},"application/mbms-deregister+xml":{source:"iana",compressible:!0},"application/mbms-envelope+xml":{source:"iana",compressible:!0},"application/mbms-msk+xml":{source:"iana",compressible:!0},"application/mbms-msk-response+xml":{source:"iana",compressible:!0},"application/mbms-protection-description+xml":{source:"iana",compressible:!0},"application/mbms-reception-report+xml":{source:"iana",compressible:!0},"application/mbms-register+xml":{source:"iana",compressible:!0},"application/mbms-register-response+xml":{source:"iana",compressible:!0},"application/mbms-schedule+xml":{source:"iana",compressible:!0},"application/mbms-user-service-description+xml":{source:"iana",compressible:!0},"application/mbox":{source:"iana",extensions:["mbox"]},"application/media-policy-dataset+xml":{source:"iana",compressible:!0,extensions:["mpf"]},"application/media_control+xml":{source:"iana",compressible:!0},"application/mediaservercontrol+xml":{source:"iana",compressible:!0,extensions:["mscml"]},"application/merge-patch+json":{source:"iana",compressible:!0},"application/metalink+xml":{source:"apache",compressible:!0,extensions:["metalink"]},"application/metalink4+xml":{source:"iana",compressible:!0,extensions:["meta4"]},"application/mets+xml":{source:"iana",compressible:!0,extensions:["mets"]},"application/mf4":{source:"iana"},"application/mikey":{source:"iana"},"application/mipc":{source:"iana"},"application/missing-blocks+cbor-seq":{source:"iana"},"application/mmt-aei+xml":{source:"iana",compressible:!0,extensions:["maei"]},"application/mmt-usd+xml":{source:"iana",compressible:!0,extensions:["musd"]},"application/mods+xml":{source:"iana",compressible:!0,extensions:["mods"]},"application/moss-keys":{source:"iana"},"application/moss-signature":{source:"iana"},"application/mosskey-data":{source:"iana"},"application/mosskey-request":{source:"iana"},"application/mp21":{source:"iana",extensions:["m21","mp21"]},"application/mp4":{source:"iana",extensions:["mp4","mpg4","mp4s","m4p"]},"application/mpeg4-generic":{source:"iana"},"application/mpeg4-iod":{source:"iana"},"application/mpeg4-iod-xmt":{source:"iana"},"application/mrb-consumer+xml":{source:"iana",compressible:!0},"application/mrb-publish+xml":{source:"iana",compressible:!0},"application/msc-ivr+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/msc-mixer+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/msix":{compressible:!1,extensions:["msix"]},"application/msixbundle":{compressible:!1,extensions:["msixbundle"]},"application/msword":{source:"iana",compressible:!1,extensions:["doc","dot"]},"application/mud+json":{source:"iana",compressible:!0},"application/multipart-core":{source:"iana"},"application/mxf":{source:"iana",extensions:["mxf"]},"application/n-quads":{source:"iana",extensions:["nq"]},"application/n-triples":{source:"iana",extensions:["nt"]},"application/nasdata":{source:"iana"},"application/news-checkgroups":{source:"iana",charset:"US-ASCII"},"application/news-groupinfo":{source:"iana",charset:"US-ASCII"},"application/news-transmission":{source:"iana"},"application/nlsml+xml":{source:"iana",compressible:!0},"application/node":{source:"iana",extensions:["cjs"]},"application/nss":{source:"iana"},"application/oauth-authz-req+jwt":{source:"iana"},"application/oblivious-dns-message":{source:"iana"},"application/ocsp-request":{source:"iana"},"application/ocsp-response":{source:"iana"},"application/octet-stream":{source:"iana",compressible:!0,extensions:["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]},"application/oda":{source:"iana",extensions:["oda"]},"application/odm+xml":{source:"iana",compressible:!0},"application/odx":{source:"iana"},"application/oebps-package+xml":{source:"iana",compressible:!0,extensions:["opf"]},"application/ogg":{source:"iana",compressible:!1,extensions:["ogx"]},"application/ohttp-keys":{source:"iana"},"application/omdoc+xml":{source:"apache",compressible:!0,extensions:["omdoc"]},"application/onenote":{source:"apache",extensions:["onetoc","onetoc2","onetmp","onepkg","one","onea"]},"application/opc-nodeset+xml":{source:"iana",compressible:!0},"application/oscore":{source:"iana"},"application/oxps":{source:"iana",extensions:["oxps"]},"application/p21":{source:"iana"},"application/p21+zip":{source:"iana",compressible:!1},"application/p2p-overlay+xml":{source:"iana",compressible:!0,extensions:["relo"]},"application/parityfec":{source:"iana"},"application/passport":{source:"iana"},"application/patch-ops-error+xml":{source:"iana",compressible:!0,extensions:["xer"]},"application/pdf":{source:"iana",compressible:!1,extensions:["pdf"]},"application/pdx":{source:"iana"},"application/pem-certificate-chain":{source:"iana"},"application/pgp-encrypted":{source:"iana",compressible:!1,extensions:["pgp"]},"application/pgp-keys":{source:"iana",extensions:["asc"]},"application/pgp-signature":{source:"iana",extensions:["sig","asc"]},"application/pics-rules":{source:"apache",extensions:["prf"]},"application/pidf+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/pidf-diff+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/pkcs10":{source:"iana",extensions:["p10"]},"application/pkcs12":{source:"iana"},"application/pkcs7-mime":{source:"iana",extensions:["p7m","p7c"]},"application/pkcs7-signature":{source:"iana",extensions:["p7s"]},"application/pkcs8":{source:"iana",extensions:["p8"]},"application/pkcs8-encrypted":{source:"iana"},"application/pkix-attr-cert":{source:"iana",extensions:["ac"]},"application/pkix-cert":{source:"iana",extensions:["cer"]},"application/pkix-crl":{source:"iana",extensions:["crl"]},"application/pkix-pkipath":{source:"iana",extensions:["pkipath"]},"application/pkixcmp":{source:"iana",extensions:["pki"]},"application/pls+xml":{source:"iana",compressible:!0,extensions:["pls"]},"application/poc-settings+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/postscript":{source:"iana",compressible:!0,extensions:["ai","eps","ps"]},"application/ppsp-tracker+json":{source:"iana",compressible:!0},"application/private-token-issuer-directory":{source:"iana"},"application/private-token-request":{source:"iana"},"application/private-token-response":{source:"iana"},"application/problem+json":{source:"iana",compressible:!0},"application/problem+xml":{source:"iana",compressible:!0},"application/provenance+xml":{source:"iana",compressible:!0,extensions:["provx"]},"application/provided-claims+jwt":{source:"iana"},"application/prs.alvestrand.titrax-sheet":{source:"iana"},"application/prs.cww":{source:"iana",extensions:["cww"]},"application/prs.cyn":{source:"iana",charset:"7-BIT"},"application/prs.hpub+zip":{source:"iana",compressible:!1},"application/prs.implied-document+xml":{source:"iana",compressible:!0},"application/prs.implied-executable":{source:"iana"},"application/prs.implied-object+json":{source:"iana",compressible:!0},"application/prs.implied-object+json-seq":{source:"iana"},"application/prs.implied-object+yaml":{source:"iana"},"application/prs.implied-structure":{source:"iana"},"application/prs.mayfile":{source:"iana"},"application/prs.nprend":{source:"iana"},"application/prs.plucker":{source:"iana"},"application/prs.rdf-xml-crypt":{source:"iana"},"application/prs.vcfbzip2":{source:"iana"},"application/prs.xsf+xml":{source:"iana",compressible:!0,extensions:["xsf"]},"application/pskc+xml":{source:"iana",compressible:!0,extensions:["pskcxml"]},"application/pvd+json":{source:"iana",compressible:!0},"application/qsig":{source:"iana"},"application/raml+yaml":{compressible:!0,extensions:["raml"]},"application/raptorfec":{source:"iana"},"application/rdap+json":{source:"iana",compressible:!0},"application/rdf+xml":{source:"iana",compressible:!0,extensions:["rdf","owl"]},"application/reginfo+xml":{source:"iana",compressible:!0,extensions:["rif"]},"application/relax-ng-compact-syntax":{source:"iana",extensions:["rnc"]},"application/remote-printing":{source:"apache"},"application/reputon+json":{source:"iana",compressible:!0},"application/resolve-response+jwt":{source:"iana"},"application/resource-lists+xml":{source:"iana",compressible:!0,extensions:["rl"]},"application/resource-lists-diff+xml":{source:"iana",compressible:!0,extensions:["rld"]},"application/rfc+xml":{source:"iana",compressible:!0},"application/riscos":{source:"iana"},"application/rlmi+xml":{source:"iana",compressible:!0},"application/rls-services+xml":{source:"iana",compressible:!0,extensions:["rs"]},"application/route-apd+xml":{source:"iana",compressible:!0,extensions:["rapd"]},"application/route-s-tsid+xml":{source:"iana",compressible:!0,extensions:["sls"]},"application/route-usd+xml":{source:"iana",compressible:!0,extensions:["rusd"]},"application/rpki-checklist":{source:"iana"},"application/rpki-ghostbusters":{source:"iana",extensions:["gbr"]},"application/rpki-manifest":{source:"iana",extensions:["mft"]},"application/rpki-publication":{source:"iana"},"application/rpki-roa":{source:"iana",extensions:["roa"]},"application/rpki-signed-tal":{source:"iana"},"application/rpki-updown":{source:"iana"},"application/rsd+xml":{source:"apache",compressible:!0,extensions:["rsd"]},"application/rss+xml":{source:"apache",compressible:!0,extensions:["rss"]},"application/rtf":{source:"iana",compressible:!0,extensions:["rtf"]},"application/rtploopback":{source:"iana"},"application/rtx":{source:"iana"},"application/samlassertion+xml":{source:"iana",compressible:!0},"application/samlmetadata+xml":{source:"iana",compressible:!0},"application/sarif+json":{source:"iana",compressible:!0},"application/sarif-external-properties+json":{source:"iana",compressible:!0},"application/sbe":{source:"iana"},"application/sbml+xml":{source:"iana",compressible:!0,extensions:["sbml"]},"application/scaip+xml":{source:"iana",compressible:!0},"application/scim+json":{source:"iana",compressible:!0},"application/scvp-cv-request":{source:"iana",extensions:["scq"]},"application/scvp-cv-response":{source:"iana",extensions:["scs"]},"application/scvp-vp-request":{source:"iana",extensions:["spq"]},"application/scvp-vp-response":{source:"iana",extensions:["spp"]},"application/sdp":{source:"iana",extensions:["sdp"]},"application/secevent+jwt":{source:"iana"},"application/senml+cbor":{source:"iana"},"application/senml+json":{source:"iana",compressible:!0},"application/senml+xml":{source:"iana",compressible:!0,extensions:["senmlx"]},"application/senml-etch+cbor":{source:"iana"},"application/senml-etch+json":{source:"iana",compressible:!0},"application/senml-exi":{source:"iana"},"application/sensml+cbor":{source:"iana"},"application/sensml+json":{source:"iana",compressible:!0},"application/sensml+xml":{source:"iana",compressible:!0,extensions:["sensmlx"]},"application/sensml-exi":{source:"iana"},"application/sep+xml":{source:"iana",compressible:!0},"application/sep-exi":{source:"iana"},"application/session-info":{source:"iana"},"application/set-payment":{source:"iana"},"application/set-payment-initiation":{source:"iana",extensions:["setpay"]},"application/set-registration":{source:"iana"},"application/set-registration-initiation":{source:"iana",extensions:["setreg"]},"application/sgml":{source:"iana"},"application/sgml-open-catalog":{source:"iana"},"application/shf+xml":{source:"iana",compressible:!0,extensions:["shf"]},"application/sieve":{source:"iana",extensions:["siv","sieve"]},"application/simple-filter+xml":{source:"iana",compressible:!0},"application/simple-message-summary":{source:"iana"},"application/simplesymbolcontainer":{source:"iana"},"application/sipc":{source:"iana"},"application/slate":{source:"iana"},"application/smil":{source:"apache"},"application/smil+xml":{source:"iana",compressible:!0,extensions:["smi","smil"]},"application/smpte336m":{source:"iana"},"application/soap+fastinfoset":{source:"iana"},"application/soap+xml":{source:"iana",compressible:!0},"application/sparql-query":{source:"iana",extensions:["rq"]},"application/sparql-results+xml":{source:"iana",compressible:!0,extensions:["srx"]},"application/spdx+json":{source:"iana",compressible:!0},"application/spirits-event+xml":{source:"iana",compressible:!0},"application/sql":{source:"iana",extensions:["sql"]},"application/srgs":{source:"iana",extensions:["gram"]},"application/srgs+xml":{source:"iana",compressible:!0,extensions:["grxml"]},"application/sru+xml":{source:"iana",compressible:!0,extensions:["sru"]},"application/ssdl+xml":{source:"apache",compressible:!0,extensions:["ssdl"]},"application/sslkeylogfile":{source:"iana"},"application/ssml+xml":{source:"iana",compressible:!0,extensions:["ssml"]},"application/st2110-41":{source:"iana"},"application/stix+json":{source:"iana",compressible:!0},"application/stratum":{source:"iana"},"application/swid+cbor":{source:"iana"},"application/swid+xml":{source:"iana",compressible:!0,extensions:["swidtag"]},"application/tamp-apex-update":{source:"iana"},"application/tamp-apex-update-confirm":{source:"iana"},"application/tamp-community-update":{source:"iana"},"application/tamp-community-update-confirm":{source:"iana"},"application/tamp-error":{source:"iana"},"application/tamp-sequence-adjust":{source:"iana"},"application/tamp-sequence-adjust-confirm":{source:"iana"},"application/tamp-status-query":{source:"iana"},"application/tamp-status-response":{source:"iana"},"application/tamp-update":{source:"iana"},"application/tamp-update-confirm":{source:"iana"},"application/tar":{compressible:!0},"application/taxii+json":{source:"iana",compressible:!0},"application/td+json":{source:"iana",compressible:!0},"application/tei+xml":{source:"iana",compressible:!0,extensions:["tei","teicorpus"]},"application/tetra_isi":{source:"iana"},"application/thraud+xml":{source:"iana",compressible:!0,extensions:["tfi"]},"application/timestamp-query":{source:"iana"},"application/timestamp-reply":{source:"iana"},"application/timestamped-data":{source:"iana",extensions:["tsd"]},"application/tlsrpt+gzip":{source:"iana"},"application/tlsrpt+json":{source:"iana",compressible:!0},"application/tm+json":{source:"iana",compressible:!0},"application/tnauthlist":{source:"iana"},"application/toc+cbor":{source:"iana"},"application/token-introspection+jwt":{source:"iana"},"application/toml":{source:"iana",compressible:!0,extensions:["toml"]},"application/trickle-ice-sdpfrag":{source:"iana"},"application/trig":{source:"iana",extensions:["trig"]},"application/trust-chain+json":{source:"iana",compressible:!0},"application/trust-mark+jwt":{source:"iana"},"application/trust-mark-delegation+jwt":{source:"iana"},"application/ttml+xml":{source:"iana",compressible:!0,extensions:["ttml"]},"application/tve-trigger":{source:"iana"},"application/tzif":{source:"iana"},"application/tzif-leap":{source:"iana"},"application/ubjson":{compressible:!1,extensions:["ubj"]},"application/uccs+cbor":{source:"iana"},"application/ujcs+json":{source:"iana",compressible:!0},"application/ulpfec":{source:"iana"},"application/urc-grpsheet+xml":{source:"iana",compressible:!0},"application/urc-ressheet+xml":{source:"iana",compressible:!0,extensions:["rsheet"]},"application/urc-targetdesc+xml":{source:"iana",compressible:!0,extensions:["td"]},"application/urc-uisocketdesc+xml":{source:"iana",compressible:!0},"application/vc":{source:"iana"},"application/vc+cose":{source:"iana"},"application/vc+jwt":{source:"iana"},"application/vcard+json":{source:"iana",compressible:!0},"application/vcard+xml":{source:"iana",compressible:!0},"application/vemmi":{source:"iana"},"application/vividence.scriptfile":{source:"apache"},"application/vnd.1000minds.decision-model+xml":{source:"iana",compressible:!0,extensions:["1km"]},"application/vnd.1ob":{source:"iana"},"application/vnd.3gpp-prose+xml":{source:"iana",compressible:!0},"application/vnd.3gpp-prose-pc3a+xml":{source:"iana",compressible:!0},"application/vnd.3gpp-prose-pc3ach+xml":{source:"iana",compressible:!0},"application/vnd.3gpp-prose-pc3ch+xml":{source:"iana",compressible:!0},"application/vnd.3gpp-prose-pc8+xml":{source:"iana",compressible:!0},"application/vnd.3gpp-v2x-local-service-information":{source:"iana"},"application/vnd.3gpp.5gnas":{source:"iana"},"application/vnd.3gpp.5gsa2x":{source:"iana"},"application/vnd.3gpp.5gsa2x-local-service-information":{source:"iana"},"application/vnd.3gpp.5gsv2x":{source:"iana"},"application/vnd.3gpp.5gsv2x-local-service-information":{source:"iana"},"application/vnd.3gpp.access-transfer-events+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.bsf+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.crs+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.current-location-discovery+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.gmop+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.gtpc":{source:"iana"},"application/vnd.3gpp.interworking-data":{source:"iana"},"application/vnd.3gpp.lpp":{source:"iana"},"application/vnd.3gpp.mc-signalling-ear":{source:"iana"},"application/vnd.3gpp.mcdata-affiliation-command+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-msgstore-ctrl-request+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-payload":{source:"iana"},"application/vnd.3gpp.mcdata-regroup+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-service-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-signalling":{source:"iana"},"application/vnd.3gpp.mcdata-ue-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-user-profile+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-affiliation-command+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-floor-request+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-location-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-mbms-usage-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-regroup+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-service-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-signed+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-ue-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-ue-init-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-user-profile+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-affiliation-command+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-location-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-mbms-usage-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-regroup+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-service-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-transmission-request+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-ue-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-user-profile+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mid-call+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.ngap":{source:"iana"},"application/vnd.3gpp.pfcp":{source:"iana"},"application/vnd.3gpp.pic-bw-large":{source:"iana",extensions:["plb"]},"application/vnd.3gpp.pic-bw-small":{source:"iana",extensions:["psb"]},"application/vnd.3gpp.pic-bw-var":{source:"iana",extensions:["pvb"]},"application/vnd.3gpp.pinapp-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.s1ap":{source:"iana"},"application/vnd.3gpp.seal-group-doc+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-location-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-mbms-usage-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-network-qos-management-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-ue-config-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-unicast-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-user-profile-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.sms":{source:"iana"},"application/vnd.3gpp.sms+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.srvcc-ext+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.srvcc-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.state-and-event-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.ussd+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.v2x":{source:"iana"},"application/vnd.3gpp.vae-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp2.bcmcsinfo+xml":{source:"iana",compressible:!0},"application/vnd.3gpp2.sms":{source:"iana"},"application/vnd.3gpp2.tcap":{source:"iana",extensions:["tcap"]},"application/vnd.3lightssoftware.imagescal":{source:"iana"},"application/vnd.3m.post-it-notes":{source:"iana",extensions:["pwn"]},"application/vnd.accpac.simply.aso":{source:"iana",extensions:["aso"]},"application/vnd.accpac.simply.imp":{source:"iana",extensions:["imp"]},"application/vnd.acm.addressxfer+json":{source:"iana",compressible:!0},"application/vnd.acm.chatbot+json":{source:"iana",compressible:!0},"application/vnd.acucobol":{source:"iana",extensions:["acu"]},"application/vnd.acucorp":{source:"iana",extensions:["atc","acutc"]},"application/vnd.adobe.air-application-installer-package+zip":{source:"apache",compressible:!1,extensions:["air"]},"application/vnd.adobe.flash.movie":{source:"iana"},"application/vnd.adobe.formscentral.fcdt":{source:"iana",extensions:["fcdt"]},"application/vnd.adobe.fxp":{source:"iana",extensions:["fxp","fxpl"]},"application/vnd.adobe.partial-upload":{source:"iana"},"application/vnd.adobe.xdp+xml":{source:"iana",compressible:!0,extensions:["xdp"]},"application/vnd.adobe.xfdf":{source:"apache",extensions:["xfdf"]},"application/vnd.aether.imp":{source:"iana"},"application/vnd.afpc.afplinedata":{source:"iana"},"application/vnd.afpc.afplinedata-pagedef":{source:"iana"},"application/vnd.afpc.cmoca-cmresource":{source:"iana"},"application/vnd.afpc.foca-charset":{source:"iana"},"application/vnd.afpc.foca-codedfont":{source:"iana"},"application/vnd.afpc.foca-codepage":{source:"iana"},"application/vnd.afpc.modca":{source:"iana"},"application/vnd.afpc.modca-cmtable":{source:"iana"},"application/vnd.afpc.modca-formdef":{source:"iana"},"application/vnd.afpc.modca-mediummap":{source:"iana"},"application/vnd.afpc.modca-objectcontainer":{source:"iana"},"application/vnd.afpc.modca-overlay":{source:"iana"},"application/vnd.afpc.modca-pagesegment":{source:"iana"},"application/vnd.age":{source:"iana",extensions:["age"]},"application/vnd.ah-barcode":{source:"apache"},"application/vnd.ahead.space":{source:"iana",extensions:["ahead"]},"application/vnd.airzip.filesecure.azf":{source:"iana",extensions:["azf"]},"application/vnd.airzip.filesecure.azs":{source:"iana",extensions:["azs"]},"application/vnd.amadeus+json":{source:"iana",compressible:!0},"application/vnd.amazon.ebook":{source:"apache",extensions:["azw"]},"application/vnd.amazon.mobi8-ebook":{source:"iana"},"application/vnd.americandynamics.acc":{source:"iana",extensions:["acc"]},"application/vnd.amiga.ami":{source:"iana",extensions:["ami"]},"application/vnd.amundsen.maze+xml":{source:"iana",compressible:!0},"application/vnd.android.ota":{source:"iana"},"application/vnd.android.package-archive":{source:"apache",compressible:!1,extensions:["apk"]},"application/vnd.anki":{source:"iana"},"application/vnd.anser-web-certificate-issue-initiation":{source:"iana",extensions:["cii"]},"application/vnd.anser-web-funds-transfer-initiation":{source:"apache",extensions:["fti"]},"application/vnd.antix.game-component":{source:"iana",extensions:["atx"]},"application/vnd.apache.arrow.file":{source:"iana"},"application/vnd.apache.arrow.stream":{source:"iana"},"application/vnd.apache.parquet":{source:"iana"},"application/vnd.apache.thrift.binary":{source:"iana"},"application/vnd.apache.thrift.compact":{source:"iana"},"application/vnd.apache.thrift.json":{source:"iana"},"application/vnd.apexlang":{source:"iana"},"application/vnd.api+json":{source:"iana",compressible:!0},"application/vnd.aplextor.warrp+json":{source:"iana",compressible:!0},"application/vnd.apothekende.reservation+json":{source:"iana",compressible:!0},"application/vnd.apple.installer+xml":{source:"iana",compressible:!0,extensions:["mpkg"]},"application/vnd.apple.keynote":{source:"iana",extensions:["key"]},"application/vnd.apple.mpegurl":{source:"iana",extensions:["m3u8"]},"application/vnd.apple.numbers":{source:"iana",extensions:["numbers"]},"application/vnd.apple.pages":{source:"iana",extensions:["pages"]},"application/vnd.apple.pkpass":{compressible:!1,extensions:["pkpass"]},"application/vnd.arastra.swi":{source:"apache"},"application/vnd.aristanetworks.swi":{source:"iana",extensions:["swi"]},"application/vnd.artisan+json":{source:"iana",compressible:!0},"application/vnd.artsquare":{source:"iana"},"application/vnd.astraea-software.iota":{source:"iana",extensions:["iota"]},"application/vnd.audiograph":{source:"iana",extensions:["aep"]},"application/vnd.autodesk.fbx":{extensions:["fbx"]},"application/vnd.autopackage":{source:"iana"},"application/vnd.avalon+json":{source:"iana",compressible:!0},"application/vnd.avistar+xml":{source:"iana",compressible:!0},"application/vnd.balsamiq.bmml+xml":{source:"iana",compressible:!0,extensions:["bmml"]},"application/vnd.balsamiq.bmpr":{source:"iana"},"application/vnd.banana-accounting":{source:"iana"},"application/vnd.bbf.usp.error":{source:"iana"},"application/vnd.bbf.usp.msg":{source:"iana"},"application/vnd.bbf.usp.msg+json":{source:"iana",compressible:!0},"application/vnd.bekitzur-stech+json":{source:"iana",compressible:!0},"application/vnd.belightsoft.lhzd+zip":{source:"iana",compressible:!1},"application/vnd.belightsoft.lhzl+zip":{source:"iana",compressible:!1},"application/vnd.bint.med-content":{source:"iana"},"application/vnd.biopax.rdf+xml":{source:"iana",compressible:!0},"application/vnd.blink-idb-value-wrapper":{source:"iana"},"application/vnd.blueice.multipass":{source:"iana",extensions:["mpm"]},"application/vnd.bluetooth.ep.oob":{source:"iana"},"application/vnd.bluetooth.le.oob":{source:"iana"},"application/vnd.bmi":{source:"iana",extensions:["bmi"]},"application/vnd.bpf":{source:"iana"},"application/vnd.bpf3":{source:"iana"},"application/vnd.businessobjects":{source:"iana",extensions:["rep"]},"application/vnd.byu.uapi+json":{source:"iana",compressible:!0},"application/vnd.bzip3":{source:"iana"},"application/vnd.c3voc.schedule+xml":{source:"iana",compressible:!0},"application/vnd.cab-jscript":{source:"iana"},"application/vnd.canon-cpdl":{source:"iana"},"application/vnd.canon-lips":{source:"iana"},"application/vnd.capasystems-pg+json":{source:"iana",compressible:!0},"application/vnd.cendio.thinlinc.clientconf":{source:"iana"},"application/vnd.century-systems.tcp_stream":{source:"iana"},"application/vnd.chemdraw+xml":{source:"iana",compressible:!0,extensions:["cdxml"]},"application/vnd.chess-pgn":{source:"iana"},"application/vnd.chipnuts.karaoke-mmd":{source:"iana",extensions:["mmd"]},"application/vnd.ciedi":{source:"iana"},"application/vnd.cinderella":{source:"iana",extensions:["cdy"]},"application/vnd.cirpack.isdn-ext":{source:"iana"},"application/vnd.citationstyles.style+xml":{source:"iana",compressible:!0,extensions:["csl"]},"application/vnd.claymore":{source:"iana",extensions:["cla"]},"application/vnd.cloanto.rp9":{source:"iana",extensions:["rp9"]},"application/vnd.clonk.c4group":{source:"iana",extensions:["c4g","c4d","c4f","c4p","c4u"]},"application/vnd.cluetrust.cartomobile-config":{source:"iana",extensions:["c11amc"]},"application/vnd.cluetrust.cartomobile-config-pkg":{source:"iana",extensions:["c11amz"]},"application/vnd.cncf.helm.chart.content.v1.tar+gzip":{source:"iana"},"application/vnd.cncf.helm.chart.provenance.v1.prov":{source:"iana"},"application/vnd.cncf.helm.config.v1+json":{source:"iana",compressible:!0},"application/vnd.coffeescript":{source:"iana"},"application/vnd.collabio.xodocuments.document":{source:"iana"},"application/vnd.collabio.xodocuments.document-template":{source:"iana"},"application/vnd.collabio.xodocuments.presentation":{source:"iana"},"application/vnd.collabio.xodocuments.presentation-template":{source:"iana"},"application/vnd.collabio.xodocuments.spreadsheet":{source:"iana"},"application/vnd.collabio.xodocuments.spreadsheet-template":{source:"iana"},"application/vnd.collection+json":{source:"iana",compressible:!0},"application/vnd.collection.doc+json":{source:"iana",compressible:!0},"application/vnd.collection.next+json":{source:"iana",compressible:!0},"application/vnd.comicbook+zip":{source:"iana",compressible:!1},"application/vnd.comicbook-rar":{source:"iana"},"application/vnd.commerce-battelle":{source:"iana"},"application/vnd.commonspace":{source:"iana",extensions:["csp"]},"application/vnd.contact.cmsg":{source:"iana",extensions:["cdbcmsg"]},"application/vnd.coreos.ignition+json":{source:"iana",compressible:!0},"application/vnd.cosmocaller":{source:"iana",extensions:["cmc"]},"application/vnd.crick.clicker":{source:"iana",extensions:["clkx"]},"application/vnd.crick.clicker.keyboard":{source:"iana",extensions:["clkk"]},"application/vnd.crick.clicker.palette":{source:"iana",extensions:["clkp"]},"application/vnd.crick.clicker.template":{source:"iana",extensions:["clkt"]},"application/vnd.crick.clicker.wordbank":{source:"iana",extensions:["clkw"]},"application/vnd.criticaltools.wbs+xml":{source:"iana",compressible:!0,extensions:["wbs"]},"application/vnd.cryptii.pipe+json":{source:"iana",compressible:!0},"application/vnd.crypto-shade-file":{source:"iana"},"application/vnd.cryptomator.encrypted":{source:"iana"},"application/vnd.cryptomator.vault":{source:"iana"},"application/vnd.ctc-posml":{source:"iana",extensions:["pml"]},"application/vnd.ctct.ws+xml":{source:"iana",compressible:!0},"application/vnd.cups-pdf":{source:"iana"},"application/vnd.cups-postscript":{source:"iana"},"application/vnd.cups-ppd":{source:"iana",extensions:["ppd"]},"application/vnd.cups-raster":{source:"iana"},"application/vnd.cups-raw":{source:"iana"},"application/vnd.curl":{source:"iana"},"application/vnd.curl.car":{source:"apache",extensions:["car"]},"application/vnd.curl.pcurl":{source:"apache",extensions:["pcurl"]},"application/vnd.cyan.dean.root+xml":{source:"iana",compressible:!0},"application/vnd.cybank":{source:"iana"},"application/vnd.cyclonedx+json":{source:"iana",compressible:!0},"application/vnd.cyclonedx+xml":{source:"iana",compressible:!0},"application/vnd.d2l.coursepackage1p0+zip":{source:"iana",compressible:!1},"application/vnd.d3m-dataset":{source:"iana"},"application/vnd.d3m-problem":{source:"iana"},"application/vnd.dart":{source:"iana",compressible:!0,extensions:["dart"]},"application/vnd.data-vision.rdz":{source:"iana",extensions:["rdz"]},"application/vnd.datalog":{source:"iana"},"application/vnd.datapackage+json":{source:"iana",compressible:!0},"application/vnd.dataresource+json":{source:"iana",compressible:!0},"application/vnd.dbf":{source:"iana",extensions:["dbf"]},"application/vnd.dcmp+xml":{source:"iana",compressible:!0,extensions:["dcmp"]},"application/vnd.debian.binary-package":{source:"iana"},"application/vnd.dece.data":{source:"iana",extensions:["uvf","uvvf","uvd","uvvd"]},"application/vnd.dece.ttml+xml":{source:"iana",compressible:!0,extensions:["uvt","uvvt"]},"application/vnd.dece.unspecified":{source:"iana",extensions:["uvx","uvvx"]},"application/vnd.dece.zip":{source:"iana",extensions:["uvz","uvvz"]},"application/vnd.denovo.fcselayout-link":{source:"iana",extensions:["fe_launch"]},"application/vnd.desmume.movie":{source:"iana"},"application/vnd.dir-bi.plate-dl-nosuffix":{source:"iana"},"application/vnd.dm.delegation+xml":{source:"iana",compressible:!0},"application/vnd.dna":{source:"iana",extensions:["dna"]},"application/vnd.document+json":{source:"iana",compressible:!0},"application/vnd.dolby.mlp":{source:"apache",extensions:["mlp"]},"application/vnd.dolby.mobile.1":{source:"iana"},"application/vnd.dolby.mobile.2":{source:"iana"},"application/vnd.doremir.scorecloud-binary-document":{source:"iana"},"application/vnd.dpgraph":{source:"iana",extensions:["dpg"]},"application/vnd.dreamfactory":{source:"iana",extensions:["dfac"]},"application/vnd.drive+json":{source:"iana",compressible:!0},"application/vnd.ds-keypoint":{source:"apache",extensions:["kpxx"]},"application/vnd.dtg.local":{source:"iana"},"application/vnd.dtg.local.flash":{source:"iana"},"application/vnd.dtg.local.html":{source:"iana"},"application/vnd.dvb.ait":{source:"iana",extensions:["ait"]},"application/vnd.dvb.dvbisl+xml":{source:"iana",compressible:!0},"application/vnd.dvb.dvbj":{source:"iana"},"application/vnd.dvb.esgcontainer":{source:"iana"},"application/vnd.dvb.ipdcdftnotifaccess":{source:"iana"},"application/vnd.dvb.ipdcesgaccess":{source:"iana"},"application/vnd.dvb.ipdcesgaccess2":{source:"iana"},"application/vnd.dvb.ipdcesgpdd":{source:"iana"},"application/vnd.dvb.ipdcroaming":{source:"iana"},"application/vnd.dvb.iptv.alfec-base":{source:"iana"},"application/vnd.dvb.iptv.alfec-enhancement":{source:"iana"},"application/vnd.dvb.notif-aggregate-root+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-container+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-generic+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-ia-msglist+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-ia-registration-request+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-ia-registration-response+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-init+xml":{source:"iana",compressible:!0},"application/vnd.dvb.pfr":{source:"iana"},"application/vnd.dvb.service":{source:"iana",extensions:["svc"]},"application/vnd.dxr":{source:"iana"},"application/vnd.dynageo":{source:"iana",extensions:["geo"]},"application/vnd.dzr":{source:"iana"},"application/vnd.easykaraoke.cdgdownload":{source:"iana"},"application/vnd.ecdis-update":{source:"iana"},"application/vnd.ecip.rlp":{source:"iana"},"application/vnd.eclipse.ditto+json":{source:"iana",compressible:!0},"application/vnd.ecowin.chart":{source:"iana",extensions:["mag"]},"application/vnd.ecowin.filerequest":{source:"iana"},"application/vnd.ecowin.fileupdate":{source:"iana"},"application/vnd.ecowin.series":{source:"iana"},"application/vnd.ecowin.seriesrequest":{source:"iana"},"application/vnd.ecowin.seriesupdate":{source:"iana"},"application/vnd.efi.img":{source:"iana"},"application/vnd.efi.iso":{source:"iana"},"application/vnd.eln+zip":{source:"iana",compressible:!1},"application/vnd.emclient.accessrequest+xml":{source:"iana",compressible:!0},"application/vnd.enliven":{source:"iana",extensions:["nml"]},"application/vnd.enphase.envoy":{source:"iana"},"application/vnd.eprints.data+xml":{source:"iana",compressible:!0},"application/vnd.epson.esf":{source:"iana",extensions:["esf"]},"application/vnd.epson.msf":{source:"iana",extensions:["msf"]},"application/vnd.epson.quickanime":{source:"iana",extensions:["qam"]},"application/vnd.epson.salt":{source:"iana",extensions:["slt"]},"application/vnd.epson.ssf":{source:"iana",extensions:["ssf"]},"application/vnd.ericsson.quickcall":{source:"iana"},"application/vnd.erofs":{source:"iana"},"application/vnd.espass-espass+zip":{source:"iana",compressible:!1},"application/vnd.eszigno3+xml":{source:"iana",compressible:!0,extensions:["es3","et3"]},"application/vnd.etsi.aoc+xml":{source:"iana",compressible:!0},"application/vnd.etsi.asic-e+zip":{source:"iana",compressible:!1},"application/vnd.etsi.asic-s+zip":{source:"iana",compressible:!1},"application/vnd.etsi.cug+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvcommand+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvdiscovery+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvprofile+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvsad-bc+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvsad-cod+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvsad-npvr+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvservice+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvsync+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvueprofile+xml":{source:"iana",compressible:!0},"application/vnd.etsi.mcid+xml":{source:"iana",compressible:!0},"application/vnd.etsi.mheg5":{source:"iana"},"application/vnd.etsi.overload-control-policy-dataset+xml":{source:"iana",compressible:!0},"application/vnd.etsi.pstn+xml":{source:"iana",compressible:!0},"application/vnd.etsi.sci+xml":{source:"iana",compressible:!0},"application/vnd.etsi.simservs+xml":{source:"iana",compressible:!0},"application/vnd.etsi.timestamp-token":{source:"iana"},"application/vnd.etsi.tsl+xml":{source:"iana",compressible:!0},"application/vnd.etsi.tsl.der":{source:"iana"},"application/vnd.eu.kasparian.car+json":{source:"iana",compressible:!0},"application/vnd.eudora.data":{source:"iana"},"application/vnd.evolv.ecig.profile":{source:"iana"},"application/vnd.evolv.ecig.settings":{source:"iana"},"application/vnd.evolv.ecig.theme":{source:"iana"},"application/vnd.exstream-empower+zip":{source:"iana",compressible:!1},"application/vnd.exstream-package":{source:"iana"},"application/vnd.ezpix-album":{source:"iana",extensions:["ez2"]},"application/vnd.ezpix-package":{source:"iana",extensions:["ez3"]},"application/vnd.f-secure.mobile":{source:"iana"},"application/vnd.familysearch.gedcom+zip":{source:"iana",compressible:!1},"application/vnd.fastcopy-disk-image":{source:"iana"},"application/vnd.fdf":{source:"apache",extensions:["fdf"]},"application/vnd.fdsn.mseed":{source:"iana",extensions:["mseed"]},"application/vnd.fdsn.seed":{source:"iana",extensions:["seed","dataless"]},"application/vnd.fdsn.stationxml+xml":{source:"iana",charset:"XML-BASED",compressible:!0},"application/vnd.ffsns":{source:"iana"},"application/vnd.ficlab.flb+zip":{source:"iana",compressible:!1},"application/vnd.filmit.zfc":{source:"iana"},"application/vnd.fints":{source:"iana"},"application/vnd.firemonkeys.cloudcell":{source:"iana"},"application/vnd.flographit":{source:"iana",extensions:["gph"]},"application/vnd.fluxtime.clip":{source:"iana",extensions:["ftc"]},"application/vnd.font-fontforge-sfd":{source:"iana"},"application/vnd.framemaker":{source:"iana",extensions:["fm","frame","maker","book"]},"application/vnd.freelog.comic":{source:"iana"},"application/vnd.frogans.fnc":{source:"apache",extensions:["fnc"]},"application/vnd.frogans.ltf":{source:"apache",extensions:["ltf"]},"application/vnd.fsc.weblaunch":{source:"iana",extensions:["fsc"]},"application/vnd.fujifilm.fb.docuworks":{source:"iana"},"application/vnd.fujifilm.fb.docuworks.binder":{source:"iana"},"application/vnd.fujifilm.fb.docuworks.container":{source:"iana"},"application/vnd.fujifilm.fb.jfi+xml":{source:"iana",compressible:!0},"application/vnd.fujitsu.oasys":{source:"iana",extensions:["oas"]},"application/vnd.fujitsu.oasys2":{source:"iana",extensions:["oa2"]},"application/vnd.fujitsu.oasys3":{source:"iana",extensions:["oa3"]},"application/vnd.fujitsu.oasysgp":{source:"iana",extensions:["fg5"]},"application/vnd.fujitsu.oasysprs":{source:"iana",extensions:["bh2"]},"application/vnd.fujixerox.art-ex":{source:"iana"},"application/vnd.fujixerox.art4":{source:"iana"},"application/vnd.fujixerox.ddd":{source:"iana",extensions:["ddd"]},"application/vnd.fujixerox.docuworks":{source:"iana",extensions:["xdw"]},"application/vnd.fujixerox.docuworks.binder":{source:"iana",extensions:["xbd"]},"application/vnd.fujixerox.docuworks.container":{source:"iana"},"application/vnd.fujixerox.hbpl":{source:"iana"},"application/vnd.fut-misnet":{source:"iana"},"application/vnd.futoin+cbor":{source:"iana"},"application/vnd.futoin+json":{source:"iana",compressible:!0},"application/vnd.fuzzysheet":{source:"iana",extensions:["fzs"]},"application/vnd.ga4gh.passport+jwt":{source:"iana"},"application/vnd.genomatix.tuxedo":{source:"iana",extensions:["txd"]},"application/vnd.genozip":{source:"iana"},"application/vnd.gentics.grd+json":{source:"iana",compressible:!0},"application/vnd.gentoo.catmetadata+xml":{source:"iana",compressible:!0},"application/vnd.gentoo.ebuild":{source:"iana"},"application/vnd.gentoo.eclass":{source:"iana"},"application/vnd.gentoo.gpkg":{source:"iana"},"application/vnd.gentoo.manifest":{source:"iana"},"application/vnd.gentoo.pkgmetadata+xml":{source:"iana",compressible:!0},"application/vnd.gentoo.xpak":{source:"iana"},"application/vnd.geo+json":{source:"apache",compressible:!0},"application/vnd.geocube+xml":{source:"apache",compressible:!0},"application/vnd.geogebra.file":{source:"iana",extensions:["ggb"]},"application/vnd.geogebra.pinboard":{source:"iana"},"application/vnd.geogebra.slides":{source:"iana",extensions:["ggs"]},"application/vnd.geogebra.tool":{source:"iana",extensions:["ggt"]},"application/vnd.geometry-explorer":{source:"iana",extensions:["gex","gre"]},"application/vnd.geonext":{source:"iana",extensions:["gxt"]},"application/vnd.geoplan":{source:"iana",extensions:["g2w"]},"application/vnd.geospace":{source:"iana",extensions:["g3w"]},"application/vnd.gerber":{source:"iana"},"application/vnd.globalplatform.card-content-mgt":{source:"iana"},"application/vnd.globalplatform.card-content-mgt-response":{source:"iana"},"application/vnd.gmx":{source:"iana",extensions:["gmx"]},"application/vnd.gnu.taler.exchange+json":{source:"iana",compressible:!0},"application/vnd.gnu.taler.merchant+json":{source:"iana",compressible:!0},"application/vnd.google-apps.audio":{},"application/vnd.google-apps.document":{compressible:!1,extensions:["gdoc"]},"application/vnd.google-apps.drawing":{compressible:!1,extensions:["gdraw"]},"application/vnd.google-apps.drive-sdk":{compressible:!1},"application/vnd.google-apps.file":{},"application/vnd.google-apps.folder":{compressible:!1},"application/vnd.google-apps.form":{compressible:!1,extensions:["gform"]},"application/vnd.google-apps.fusiontable":{},"application/vnd.google-apps.jam":{compressible:!1,extensions:["gjam"]},"application/vnd.google-apps.mail-layout":{},"application/vnd.google-apps.map":{compressible:!1,extensions:["gmap"]},"application/vnd.google-apps.photo":{},"application/vnd.google-apps.presentation":{compressible:!1,extensions:["gslides"]},"application/vnd.google-apps.script":{compressible:!1,extensions:["gscript"]},"application/vnd.google-apps.shortcut":{},"application/vnd.google-apps.site":{compressible:!1,extensions:["gsite"]},"application/vnd.google-apps.spreadsheet":{compressible:!1,extensions:["gsheet"]},"application/vnd.google-apps.unknown":{},"application/vnd.google-apps.video":{},"application/vnd.google-earth.kml+xml":{source:"iana",compressible:!0,extensions:["kml"]},"application/vnd.google-earth.kmz":{source:"iana",compressible:!1,extensions:["kmz"]},"application/vnd.gov.sk.e-form+xml":{source:"apache",compressible:!0},"application/vnd.gov.sk.e-form+zip":{source:"iana",compressible:!1},"application/vnd.gov.sk.xmldatacontainer+xml":{source:"iana",compressible:!0,extensions:["xdcf"]},"application/vnd.gpxsee.map+xml":{source:"iana",compressible:!0},"application/vnd.grafeq":{source:"iana",extensions:["gqf","gqs"]},"application/vnd.gridmp":{source:"iana"},"application/vnd.groove-account":{source:"iana",extensions:["gac"]},"application/vnd.groove-help":{source:"iana",extensions:["ghf"]},"application/vnd.groove-identity-message":{source:"iana",extensions:["gim"]},"application/vnd.groove-injector":{source:"iana",extensions:["grv"]},"application/vnd.groove-tool-message":{source:"iana",extensions:["gtm"]},"application/vnd.groove-tool-template":{source:"iana",extensions:["tpl"]},"application/vnd.groove-vcard":{source:"iana",extensions:["vcg"]},"application/vnd.hal+json":{source:"iana",compressible:!0},"application/vnd.hal+xml":{source:"iana",compressible:!0,extensions:["hal"]},"application/vnd.handheld-entertainment+xml":{source:"iana",compressible:!0,extensions:["zmm"]},"application/vnd.hbci":{source:"iana",extensions:["hbci"]},"application/vnd.hc+json":{source:"iana",compressible:!0},"application/vnd.hcl-bireports":{source:"iana"},"application/vnd.hdt":{source:"iana"},"application/vnd.heroku+json":{source:"iana",compressible:!0},"application/vnd.hhe.lesson-player":{source:"iana",extensions:["les"]},"application/vnd.hp-hpgl":{source:"iana",extensions:["hpgl"]},"application/vnd.hp-hpid":{source:"iana",extensions:["hpid"]},"application/vnd.hp-hps":{source:"iana",extensions:["hps"]},"application/vnd.hp-jlyt":{source:"iana",extensions:["jlt"]},"application/vnd.hp-pcl":{source:"iana",extensions:["pcl"]},"application/vnd.hp-pclxl":{source:"iana",extensions:["pclxl"]},"application/vnd.hsl":{source:"iana"},"application/vnd.httphone":{source:"iana"},"application/vnd.hydrostatix.sof-data":{source:"iana",extensions:["sfd-hdstx"]},"application/vnd.hyper+json":{source:"iana",compressible:!0},"application/vnd.hyper-item+json":{source:"iana",compressible:!0},"application/vnd.hyperdrive+json":{source:"iana",compressible:!0},"application/vnd.hzn-3d-crossword":{source:"iana"},"application/vnd.ibm.afplinedata":{source:"apache"},"application/vnd.ibm.electronic-media":{source:"iana"},"application/vnd.ibm.minipay":{source:"iana",extensions:["mpy"]},"application/vnd.ibm.modcap":{source:"apache",extensions:["afp","listafp","list3820"]},"application/vnd.ibm.rights-management":{source:"iana",extensions:["irm"]},"application/vnd.ibm.secure-container":{source:"iana",extensions:["sc"]},"application/vnd.iccprofile":{source:"iana",extensions:["icc","icm"]},"application/vnd.ieee.1905":{source:"iana"},"application/vnd.igloader":{source:"iana",extensions:["igl"]},"application/vnd.imagemeter.folder+zip":{source:"iana",compressible:!1},"application/vnd.imagemeter.image+zip":{source:"iana",compressible:!1},"application/vnd.immervision-ivp":{source:"iana",extensions:["ivp"]},"application/vnd.immervision-ivu":{source:"iana",extensions:["ivu"]},"application/vnd.ims.imsccv1p1":{source:"iana"},"application/vnd.ims.imsccv1p2":{source:"iana"},"application/vnd.ims.imsccv1p3":{source:"iana"},"application/vnd.ims.lis.v2.result+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolconsumerprofile+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolproxy+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolproxy.id+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolsettings+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolsettings.simple+json":{source:"iana",compressible:!0},"application/vnd.informedcontrol.rms+xml":{source:"iana",compressible:!0},"application/vnd.informix-visionary":{source:"apache"},"application/vnd.infotech.project":{source:"iana"},"application/vnd.infotech.project+xml":{source:"iana",compressible:!0},"application/vnd.innopath.wamp.notification":{source:"iana"},"application/vnd.insors.igm":{source:"iana",extensions:["igm"]},"application/vnd.intercon.formnet":{source:"iana",extensions:["xpw","xpx"]},"application/vnd.intergeo":{source:"iana",extensions:["i2g"]},"application/vnd.intertrust.digibox":{source:"iana"},"application/vnd.intertrust.nncp":{source:"iana"},"application/vnd.intu.qbo":{source:"iana",extensions:["qbo"]},"application/vnd.intu.qfx":{source:"iana",extensions:["qfx"]},"application/vnd.ipfs.ipns-record":{source:"iana"},"application/vnd.ipld.car":{source:"iana"},"application/vnd.ipld.dag-cbor":{source:"iana"},"application/vnd.ipld.dag-json":{source:"iana"},"application/vnd.ipld.raw":{source:"iana"},"application/vnd.iptc.g2.catalogitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.conceptitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.knowledgeitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.newsitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.newsmessage+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.packageitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.planningitem+xml":{source:"iana",compressible:!0},"application/vnd.ipunplugged.rcprofile":{source:"iana",extensions:["rcprofile"]},"application/vnd.irepository.package+xml":{source:"iana",compressible:!0,extensions:["irp"]},"application/vnd.is-xpr":{source:"iana",extensions:["xpr"]},"application/vnd.isac.fcs":{source:"iana",extensions:["fcs"]},"application/vnd.iso11783-10+zip":{source:"iana",compressible:!1},"application/vnd.jam":{source:"iana",extensions:["jam"]},"application/vnd.japannet-directory-service":{source:"iana"},"application/vnd.japannet-jpnstore-wakeup":{source:"iana"},"application/vnd.japannet-payment-wakeup":{source:"iana"},"application/vnd.japannet-registration":{source:"iana"},"application/vnd.japannet-registration-wakeup":{source:"iana"},"application/vnd.japannet-setstore-wakeup":{source:"iana"},"application/vnd.japannet-verification":{source:"iana"},"application/vnd.japannet-verification-wakeup":{source:"iana"},"application/vnd.jcp.javame.midlet-rms":{source:"iana",extensions:["rms"]},"application/vnd.jisp":{source:"iana",extensions:["jisp"]},"application/vnd.joost.joda-archive":{source:"iana",extensions:["joda"]},"application/vnd.jsk.isdn-ngn":{source:"iana"},"application/vnd.kahootz":{source:"iana",extensions:["ktz","ktr"]},"application/vnd.kde.karbon":{source:"iana",extensions:["karbon"]},"application/vnd.kde.kchart":{source:"iana",extensions:["chrt"]},"application/vnd.kde.kformula":{source:"iana",extensions:["kfo"]},"application/vnd.kde.kivio":{source:"iana",extensions:["flw"]},"application/vnd.kde.kontour":{source:"iana",extensions:["kon"]},"application/vnd.kde.kpresenter":{source:"iana",extensions:["kpr","kpt"]},"application/vnd.kde.kspread":{source:"iana",extensions:["ksp"]},"application/vnd.kde.kword":{source:"iana",extensions:["kwd","kwt"]},"application/vnd.kdl":{source:"iana"},"application/vnd.kenameaapp":{source:"iana",extensions:["htke"]},"application/vnd.keyman.kmp+zip":{source:"iana",compressible:!1},"application/vnd.keyman.kmx":{source:"iana"},"application/vnd.kidspiration":{source:"iana",extensions:["kia"]},"application/vnd.kinar":{source:"iana",extensions:["kne","knp"]},"application/vnd.koan":{source:"iana",extensions:["skp","skd","skt","skm"]},"application/vnd.kodak-descriptor":{source:"iana",extensions:["sse"]},"application/vnd.las":{source:"iana"},"application/vnd.las.las+json":{source:"iana",compressible:!0},"application/vnd.las.las+xml":{source:"iana",compressible:!0,extensions:["lasxml"]},"application/vnd.laszip":{source:"iana"},"application/vnd.ldev.productlicensing":{source:"iana"},"application/vnd.leap+json":{source:"iana",compressible:!0},"application/vnd.liberty-request+xml":{source:"iana",compressible:!0},"application/vnd.llamagraphics.life-balance.desktop":{source:"iana",extensions:["lbd"]},"application/vnd.llamagraphics.life-balance.exchange+xml":{source:"iana",compressible:!0,extensions:["lbe"]},"application/vnd.logipipe.circuit+zip":{source:"iana",compressible:!1},"application/vnd.loom":{source:"iana"},"application/vnd.lotus-1-2-3":{source:"iana",extensions:["123"]},"application/vnd.lotus-approach":{source:"iana",extensions:["apr"]},"application/vnd.lotus-freelance":{source:"iana",extensions:["pre"]},"application/vnd.lotus-notes":{source:"iana",extensions:["nsf"]},"application/vnd.lotus-organizer":{source:"iana",extensions:["org"]},"application/vnd.lotus-screencam":{source:"iana",extensions:["scm"]},"application/vnd.lotus-wordpro":{source:"iana",extensions:["lwp"]},"application/vnd.macports.portpkg":{source:"iana",extensions:["portpkg"]},"application/vnd.mapbox-vector-tile":{source:"iana",extensions:["mvt"]},"application/vnd.marlin.drm.actiontoken+xml":{source:"iana",compressible:!0},"application/vnd.marlin.drm.conftoken+xml":{source:"iana",compressible:!0},"application/vnd.marlin.drm.license+xml":{source:"iana",compressible:!0},"application/vnd.marlin.drm.mdcf":{source:"iana"},"application/vnd.mason+json":{source:"iana",compressible:!0},"application/vnd.maxar.archive.3tz+zip":{source:"iana",compressible:!1},"application/vnd.maxmind.maxmind-db":{source:"iana"},"application/vnd.mcd":{source:"iana",extensions:["mcd"]},"application/vnd.mdl":{source:"iana"},"application/vnd.mdl-mbsdf":{source:"iana"},"application/vnd.medcalcdata":{source:"iana",extensions:["mc1"]},"application/vnd.mediastation.cdkey":{source:"iana",extensions:["cdkey"]},"application/vnd.medicalholodeck.recordxr":{source:"iana"},"application/vnd.meridian-slingshot":{source:"iana"},"application/vnd.mermaid":{source:"iana"},"application/vnd.mfer":{source:"iana",extensions:["mwf"]},"application/vnd.mfmp":{source:"iana",extensions:["mfm"]},"application/vnd.micro+json":{source:"iana",compressible:!0},"application/vnd.micrografx.flo":{source:"iana",extensions:["flo"]},"application/vnd.micrografx.igx":{source:"iana",extensions:["igx"]},"application/vnd.microsoft.portable-executable":{source:"iana"},"application/vnd.microsoft.windows.thumbnail-cache":{source:"iana"},"application/vnd.miele+json":{source:"iana",compressible:!0},"application/vnd.mif":{source:"iana",extensions:["mif"]},"application/vnd.minisoft-hp3000-save":{source:"iana"},"application/vnd.mitsubishi.misty-guard.trustweb":{source:"iana"},"application/vnd.mobius.daf":{source:"iana",extensions:["daf"]},"application/vnd.mobius.dis":{source:"iana",extensions:["dis"]},"application/vnd.mobius.mbk":{source:"iana",extensions:["mbk"]},"application/vnd.mobius.mqy":{source:"iana",extensions:["mqy"]},"application/vnd.mobius.msl":{source:"iana",extensions:["msl"]},"application/vnd.mobius.plc":{source:"iana",extensions:["plc"]},"application/vnd.mobius.txf":{source:"iana",extensions:["txf"]},"application/vnd.modl":{source:"iana"},"application/vnd.mophun.application":{source:"iana",extensions:["mpn"]},"application/vnd.mophun.certificate":{source:"iana",extensions:["mpc"]},"application/vnd.motorola.flexsuite":{source:"iana"},"application/vnd.motorola.flexsuite.adsi":{source:"iana"},"application/vnd.motorola.flexsuite.fis":{source:"iana"},"application/vnd.motorola.flexsuite.gotap":{source:"iana"},"application/vnd.motorola.flexsuite.kmr":{source:"iana"},"application/vnd.motorola.flexsuite.ttc":{source:"iana"},"application/vnd.motorola.flexsuite.wem":{source:"iana"},"application/vnd.motorola.iprm":{source:"iana"},"application/vnd.mozilla.xul+xml":{source:"iana",compressible:!0,extensions:["xul"]},"application/vnd.ms-3mfdocument":{source:"iana"},"application/vnd.ms-artgalry":{source:"iana",extensions:["cil"]},"application/vnd.ms-asf":{source:"iana"},"application/vnd.ms-cab-compressed":{source:"iana",extensions:["cab"]},"application/vnd.ms-color.iccprofile":{source:"apache"},"application/vnd.ms-excel":{source:"iana",compressible:!1,extensions:["xls","xlm","xla","xlc","xlt","xlw"]},"application/vnd.ms-excel.addin.macroenabled.12":{source:"iana",extensions:["xlam"]},"application/vnd.ms-excel.sheet.binary.macroenabled.12":{source:"iana",extensions:["xlsb"]},"application/vnd.ms-excel.sheet.macroenabled.12":{source:"iana",extensions:["xlsm"]},"application/vnd.ms-excel.template.macroenabled.12":{source:"iana",extensions:["xltm"]},"application/vnd.ms-fontobject":{source:"iana",compressible:!0,extensions:["eot"]},"application/vnd.ms-htmlhelp":{source:"iana",extensions:["chm"]},"application/vnd.ms-ims":{source:"iana",extensions:["ims"]},"application/vnd.ms-lrm":{source:"iana",extensions:["lrm"]},"application/vnd.ms-office.activex+xml":{source:"iana",compressible:!0},"application/vnd.ms-officetheme":{source:"iana",extensions:["thmx"]},"application/vnd.ms-opentype":{source:"apache",compressible:!0},"application/vnd.ms-outlook":{compressible:!1,extensions:["msg"]},"application/vnd.ms-package.obfuscated-opentype":{source:"apache"},"application/vnd.ms-pki.seccat":{source:"apache",extensions:["cat"]},"application/vnd.ms-pki.stl":{source:"apache",extensions:["stl"]},"application/vnd.ms-playready.initiator+xml":{source:"iana",compressible:!0},"application/vnd.ms-powerpoint":{source:"iana",compressible:!1,extensions:["ppt","pps","pot"]},"application/vnd.ms-powerpoint.addin.macroenabled.12":{source:"iana",extensions:["ppam"]},"application/vnd.ms-powerpoint.presentation.macroenabled.12":{source:"iana",extensions:["pptm"]},"application/vnd.ms-powerpoint.slide.macroenabled.12":{source:"iana",extensions:["sldm"]},"application/vnd.ms-powerpoint.slideshow.macroenabled.12":{source:"iana",extensions:["ppsm"]},"application/vnd.ms-powerpoint.template.macroenabled.12":{source:"iana",extensions:["potm"]},"application/vnd.ms-printdevicecapabilities+xml":{source:"iana",compressible:!0},"application/vnd.ms-printing.printticket+xml":{source:"apache",compressible:!0},"application/vnd.ms-printschematicket+xml":{source:"iana",compressible:!0},"application/vnd.ms-project":{source:"iana",extensions:["mpp","mpt"]},"application/vnd.ms-tnef":{source:"iana"},"application/vnd.ms-visio.viewer":{extensions:["vdx"]},"application/vnd.ms-windows.devicepairing":{source:"iana"},"application/vnd.ms-windows.nwprinting.oob":{source:"iana"},"application/vnd.ms-windows.printerpairing":{source:"iana"},"application/vnd.ms-windows.wsd.oob":{source:"iana"},"application/vnd.ms-wmdrm.lic-chlg-req":{source:"iana"},"application/vnd.ms-wmdrm.lic-resp":{source:"iana"},"application/vnd.ms-wmdrm.meter-chlg-req":{source:"iana"},"application/vnd.ms-wmdrm.meter-resp":{source:"iana"},"application/vnd.ms-word.document.macroenabled.12":{source:"iana",extensions:["docm"]},"application/vnd.ms-word.template.macroenabled.12":{source:"iana",extensions:["dotm"]},"application/vnd.ms-works":{source:"iana",extensions:["wps","wks","wcm","wdb"]},"application/vnd.ms-wpl":{source:"iana",extensions:["wpl"]},"application/vnd.ms-xpsdocument":{source:"iana",compressible:!1,extensions:["xps"]},"application/vnd.msa-disk-image":{source:"iana"},"application/vnd.mseq":{source:"iana",extensions:["mseq"]},"application/vnd.msgpack":{source:"iana"},"application/vnd.msign":{source:"iana"},"application/vnd.multiad.creator":{source:"iana"},"application/vnd.multiad.creator.cif":{source:"iana"},"application/vnd.music-niff":{source:"iana"},"application/vnd.musician":{source:"iana",extensions:["mus"]},"application/vnd.muvee.style":{source:"iana",extensions:["msty"]},"application/vnd.mynfc":{source:"iana",extensions:["taglet"]},"application/vnd.nacamar.ybrid+json":{source:"iana",compressible:!0},"application/vnd.nato.bindingdataobject+cbor":{source:"iana"},"application/vnd.nato.bindingdataobject+json":{source:"iana",compressible:!0},"application/vnd.nato.bindingdataobject+xml":{source:"iana",compressible:!0,extensions:["bdo"]},"application/vnd.nato.openxmlformats-package.iepd+zip":{source:"iana",compressible:!1},"application/vnd.ncd.control":{source:"iana"},"application/vnd.ncd.reference":{source:"iana"},"application/vnd.nearst.inv+json":{source:"iana",compressible:!0},"application/vnd.nebumind.line":{source:"iana"},"application/vnd.nervana":{source:"iana"},"application/vnd.netfpx":{source:"iana"},"application/vnd.neurolanguage.nlu":{source:"iana",extensions:["nlu"]},"application/vnd.nimn":{source:"iana"},"application/vnd.nintendo.nitro.rom":{source:"iana"},"application/vnd.nintendo.snes.rom":{source:"iana"},"application/vnd.nitf":{source:"iana",extensions:["ntf","nitf"]},"application/vnd.noblenet-directory":{source:"iana",extensions:["nnd"]},"application/vnd.noblenet-sealer":{source:"iana",extensions:["nns"]},"application/vnd.noblenet-web":{source:"iana",extensions:["nnw"]},"application/vnd.nokia.catalogs":{source:"iana"},"application/vnd.nokia.conml+wbxml":{source:"iana"},"application/vnd.nokia.conml+xml":{source:"iana",compressible:!0},"application/vnd.nokia.iptv.config+xml":{source:"iana",compressible:!0},"application/vnd.nokia.isds-radio-presets":{source:"iana"},"application/vnd.nokia.landmark+wbxml":{source:"iana"},"application/vnd.nokia.landmark+xml":{source:"iana",compressible:!0},"application/vnd.nokia.landmarkcollection+xml":{source:"iana",compressible:!0},"application/vnd.nokia.n-gage.ac+xml":{source:"iana",compressible:!0,extensions:["ac"]},"application/vnd.nokia.n-gage.data":{source:"iana",extensions:["ngdat"]},"application/vnd.nokia.n-gage.symbian.install":{source:"apache",extensions:["n-gage"]},"application/vnd.nokia.ncd":{source:"iana"},"application/vnd.nokia.pcd+wbxml":{source:"iana"},"application/vnd.nokia.pcd+xml":{source:"iana",compressible:!0},"application/vnd.nokia.radio-preset":{source:"iana",extensions:["rpst"]},"application/vnd.nokia.radio-presets":{source:"iana",extensions:["rpss"]},"application/vnd.novadigm.edm":{source:"iana",extensions:["edm"]},"application/vnd.novadigm.edx":{source:"iana",extensions:["edx"]},"application/vnd.novadigm.ext":{source:"iana",extensions:["ext"]},"application/vnd.ntt-local.content-share":{source:"iana"},"application/vnd.ntt-local.file-transfer":{source:"iana"},"application/vnd.ntt-local.ogw_remote-access":{source:"iana"},"application/vnd.ntt-local.sip-ta_remote":{source:"iana"},"application/vnd.ntt-local.sip-ta_tcp_stream":{source:"iana"},"application/vnd.oai.workflows":{source:"iana"},"application/vnd.oai.workflows+json":{source:"iana",compressible:!0},"application/vnd.oai.workflows+yaml":{source:"iana"},"application/vnd.oasis.opendocument.base":{source:"iana"},"application/vnd.oasis.opendocument.chart":{source:"iana",extensions:["odc"]},"application/vnd.oasis.opendocument.chart-template":{source:"iana",extensions:["otc"]},"application/vnd.oasis.opendocument.database":{source:"apache",extensions:["odb"]},"application/vnd.oasis.opendocument.formula":{source:"iana",extensions:["odf"]},"application/vnd.oasis.opendocument.formula-template":{source:"iana",extensions:["odft"]},"application/vnd.oasis.opendocument.graphics":{source:"iana",compressible:!1,extensions:["odg"]},"application/vnd.oasis.opendocument.graphics-template":{source:"iana",extensions:["otg"]},"application/vnd.oasis.opendocument.image":{source:"iana",extensions:["odi"]},"application/vnd.oasis.opendocument.image-template":{source:"iana",extensions:["oti"]},"application/vnd.oasis.opendocument.presentation":{source:"iana",compressible:!1,extensions:["odp"]},"application/vnd.oasis.opendocument.presentation-template":{source:"iana",extensions:["otp"]},"application/vnd.oasis.opendocument.spreadsheet":{source:"iana",compressible:!1,extensions:["ods"]},"application/vnd.oasis.opendocument.spreadsheet-template":{source:"iana",extensions:["ots"]},"application/vnd.oasis.opendocument.text":{source:"iana",compressible:!1,extensions:["odt"]},"application/vnd.oasis.opendocument.text-master":{source:"iana",extensions:["odm"]},"application/vnd.oasis.opendocument.text-master-template":{source:"iana"},"application/vnd.oasis.opendocument.text-template":{source:"iana",extensions:["ott"]},"application/vnd.oasis.opendocument.text-web":{source:"iana",extensions:["oth"]},"application/vnd.obn":{source:"iana"},"application/vnd.ocf+cbor":{source:"iana"},"application/vnd.oci.image.manifest.v1+json":{source:"iana",compressible:!0},"application/vnd.oftn.l10n+json":{source:"iana",compressible:!0},"application/vnd.oipf.contentaccessdownload+xml":{source:"iana",compressible:!0},"application/vnd.oipf.contentaccessstreaming+xml":{source:"iana",compressible:!0},"application/vnd.oipf.cspg-hexbinary":{source:"iana"},"application/vnd.oipf.dae.svg+xml":{source:"iana",compressible:!0},"application/vnd.oipf.dae.xhtml+xml":{source:"iana",compressible:!0},"application/vnd.oipf.mippvcontrolmessage+xml":{source:"iana",compressible:!0},"application/vnd.oipf.pae.gem":{source:"iana"},"application/vnd.oipf.spdiscovery+xml":{source:"iana",compressible:!0},"application/vnd.oipf.spdlist+xml":{source:"iana",compressible:!0},"application/vnd.oipf.ueprofile+xml":{source:"iana",compressible:!0},"application/vnd.oipf.userprofile+xml":{source:"iana",compressible:!0},"application/vnd.olpc-sugar":{source:"iana",extensions:["xo"]},"application/vnd.oma-scws-config":{source:"iana"},"application/vnd.oma-scws-http-request":{source:"iana"},"application/vnd.oma-scws-http-response":{source:"iana"},"application/vnd.oma.bcast.associated-procedure-parameter+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.drm-trigger+xml":{source:"apache",compressible:!0},"application/vnd.oma.bcast.imd+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.ltkm":{source:"iana"},"application/vnd.oma.bcast.notification+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.provisioningtrigger":{source:"iana"},"application/vnd.oma.bcast.sgboot":{source:"iana"},"application/vnd.oma.bcast.sgdd+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.sgdu":{source:"iana"},"application/vnd.oma.bcast.simple-symbol-container":{source:"iana"},"application/vnd.oma.bcast.smartcard-trigger+xml":{source:"apache",compressible:!0},"application/vnd.oma.bcast.sprov+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.stkm":{source:"iana"},"application/vnd.oma.cab-address-book+xml":{source:"iana",compressible:!0},"application/vnd.oma.cab-feature-handler+xml":{source:"iana",compressible:!0},"application/vnd.oma.cab-pcc+xml":{source:"iana",compressible:!0},"application/vnd.oma.cab-subs-invite+xml":{source:"iana",compressible:!0},"application/vnd.oma.cab-user-prefs+xml":{source:"iana",compressible:!0},"application/vnd.oma.dcd":{source:"iana"},"application/vnd.oma.dcdc":{source:"iana"},"application/vnd.oma.dd2+xml":{source:"iana",compressible:!0,extensions:["dd2"]},"application/vnd.oma.drm.risd+xml":{source:"iana",compressible:!0},"application/vnd.oma.group-usage-list+xml":{source:"iana",compressible:!0},"application/vnd.oma.lwm2m+cbor":{source:"iana"},"application/vnd.oma.lwm2m+json":{source:"iana",compressible:!0},"application/vnd.oma.lwm2m+tlv":{source:"iana"},"application/vnd.oma.pal+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.detailed-progress-report+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.final-report+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.groups+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.invocation-descriptor+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.optimized-progress-report+xml":{source:"iana",compressible:!0},"application/vnd.oma.push":{source:"iana"},"application/vnd.oma.scidm.messages+xml":{source:"iana",compressible:!0},"application/vnd.oma.xcap-directory+xml":{source:"iana",compressible:!0},"application/vnd.omads-email+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/vnd.omads-file+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/vnd.omads-folder+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/vnd.omaloc-supl-init":{source:"iana"},"application/vnd.onepager":{source:"iana"},"application/vnd.onepagertamp":{source:"iana"},"application/vnd.onepagertamx":{source:"iana"},"application/vnd.onepagertat":{source:"iana"},"application/vnd.onepagertatp":{source:"iana"},"application/vnd.onepagertatx":{source:"iana"},"application/vnd.onvif.metadata":{source:"iana"},"application/vnd.openblox.game+xml":{source:"iana",compressible:!0,extensions:["obgx"]},"application/vnd.openblox.game-binary":{source:"iana"},"application/vnd.openeye.oeb":{source:"iana"},"application/vnd.openofficeorg.extension":{source:"apache",extensions:["oxt"]},"application/vnd.openstreetmap.data+xml":{source:"iana",compressible:!0,extensions:["osm"]},"application/vnd.opentimestamps.ots":{source:"iana"},"application/vnd.openvpi.dspx+json":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.custom-properties+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.customxmlproperties+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawing+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.chart+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.extended-properties+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.comments+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.presentation":{source:"iana",compressible:!1,extensions:["pptx"]},"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slide":{source:"iana",extensions:["sldx"]},"application/vnd.openxmlformats-officedocument.presentationml.slide+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slideshow":{source:"iana",extensions:["ppsx"]},"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.tags+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.template":{source:"iana",extensions:["potx"]},"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{source:"iana",compressible:!1,extensions:["xlsx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.template":{source:"iana",extensions:["xltx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.theme+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.themeoverride+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.vmldrawing":{source:"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.document":{source:"iana",compressible:!1,extensions:["docx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.template":{source:"iana",extensions:["dotx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-package.core-properties+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-package.relationships+xml":{source:"iana",compressible:!0},"application/vnd.oracle.resource+json":{source:"iana",compressible:!0},"application/vnd.orange.indata":{source:"iana"},"application/vnd.osa.netdeploy":{source:"iana"},"application/vnd.osgeo.mapguide.package":{source:"iana",extensions:["mgp"]},"application/vnd.osgi.bundle":{source:"iana"},"application/vnd.osgi.dp":{source:"iana",extensions:["dp"]},"application/vnd.osgi.subsystem":{source:"iana",extensions:["esa"]},"application/vnd.otps.ct-kip+xml":{source:"iana",compressible:!0},"application/vnd.oxli.countgraph":{source:"iana"},"application/vnd.pagerduty+json":{source:"iana",compressible:!0},"application/vnd.palm":{source:"iana",extensions:["pdb","pqa","oprc"]},"application/vnd.panoply":{source:"iana"},"application/vnd.paos.xml":{source:"iana"},"application/vnd.patentdive":{source:"iana"},"application/vnd.patientecommsdoc":{source:"iana"},"application/vnd.pawaafile":{source:"iana",extensions:["paw"]},"application/vnd.pcos":{source:"iana"},"application/vnd.pg.format":{source:"iana",extensions:["str"]},"application/vnd.pg.osasli":{source:"iana",extensions:["ei6"]},"application/vnd.piaccess.application-licence":{source:"iana"},"application/vnd.picsel":{source:"iana",extensions:["efif"]},"application/vnd.pmi.widget":{source:"iana",extensions:["wg"]},"application/vnd.poc.group-advertisement+xml":{source:"iana",compressible:!0},"application/vnd.pocketlearn":{source:"iana",extensions:["plf"]},"application/vnd.powerbuilder6":{source:"iana",extensions:["pbd"]},"application/vnd.powerbuilder6-s":{source:"iana"},"application/vnd.powerbuilder7":{source:"iana"},"application/vnd.powerbuilder7-s":{source:"iana"},"application/vnd.powerbuilder75":{source:"iana"},"application/vnd.powerbuilder75-s":{source:"iana"},"application/vnd.preminet":{source:"iana"},"application/vnd.previewsystems.box":{source:"iana",extensions:["box"]},"application/vnd.procrate.brushset":{extensions:["brushset"]},"application/vnd.procreate.brush":{extensions:["brush"]},"application/vnd.procreate.dream":{extensions:["drm"]},"application/vnd.proteus.magazine":{source:"iana",extensions:["mgz"]},"application/vnd.psfs":{source:"iana"},"application/vnd.pt.mundusmundi":{source:"iana"},"application/vnd.publishare-delta-tree":{source:"iana",extensions:["qps"]},"application/vnd.pvi.ptid1":{source:"iana",extensions:["ptid"]},"application/vnd.pwg-multiplexed":{source:"iana"},"application/vnd.pwg-xhtml-print+xml":{source:"iana",compressible:!0,extensions:["xhtm"]},"application/vnd.qualcomm.brew-app-res":{source:"iana"},"application/vnd.quarantainenet":{source:"iana"},"application/vnd.quark.quarkxpress":{source:"iana",extensions:["qxd","qxt","qwd","qwt","qxl","qxb"]},"application/vnd.quobject-quoxdocument":{source:"iana"},"application/vnd.radisys.moml+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit-conf+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit-conn+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit-dialog+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit-stream+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-conf+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-base+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-fax-detect+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-fax-sendrecv+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-group+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-speech+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-transform+xml":{source:"iana",compressible:!0},"application/vnd.rainstor.data":{source:"iana"},"application/vnd.rapid":{source:"iana"},"application/vnd.rar":{source:"iana",extensions:["rar"]},"application/vnd.realvnc.bed":{source:"iana",extensions:["bed"]},"application/vnd.recordare.musicxml":{source:"iana",extensions:["mxl"]},"application/vnd.recordare.musicxml+xml":{source:"iana",compressible:!0,extensions:["musicxml"]},"application/vnd.relpipe":{source:"iana"},"application/vnd.renlearn.rlprint":{source:"iana"},"application/vnd.resilient.logic":{source:"iana"},"application/vnd.restful+json":{source:"iana",compressible:!0},"application/vnd.rig.cryptonote":{source:"iana",extensions:["cryptonote"]},"application/vnd.rim.cod":{source:"apache",extensions:["cod"]},"application/vnd.rn-realmedia":{source:"apache",extensions:["rm"]},"application/vnd.rn-realmedia-vbr":{source:"apache",extensions:["rmvb"]},"application/vnd.route66.link66+xml":{source:"iana",compressible:!0,extensions:["link66"]},"application/vnd.rs-274x":{source:"iana"},"application/vnd.ruckus.download":{source:"iana"},"application/vnd.s3sms":{source:"iana"},"application/vnd.sailingtracker.track":{source:"iana",extensions:["st"]},"application/vnd.sar":{source:"iana"},"application/vnd.sbm.cid":{source:"iana"},"application/vnd.sbm.mid2":{source:"iana"},"application/vnd.scribus":{source:"iana"},"application/vnd.sealed.3df":{source:"iana"},"application/vnd.sealed.csf":{source:"iana"},"application/vnd.sealed.doc":{source:"iana"},"application/vnd.sealed.eml":{source:"iana"},"application/vnd.sealed.mht":{source:"iana"},"application/vnd.sealed.net":{source:"iana"},"application/vnd.sealed.ppt":{source:"iana"},"application/vnd.sealed.tiff":{source:"iana"},"application/vnd.sealed.xls":{source:"iana"},"application/vnd.sealedmedia.softseal.html":{source:"iana"},"application/vnd.sealedmedia.softseal.pdf":{source:"iana"},"application/vnd.seemail":{source:"iana",extensions:["see"]},"application/vnd.seis+json":{source:"iana",compressible:!0},"application/vnd.sema":{source:"iana",extensions:["sema"]},"application/vnd.semd":{source:"iana",extensions:["semd"]},"application/vnd.semf":{source:"iana",extensions:["semf"]},"application/vnd.shade-save-file":{source:"iana"},"application/vnd.shana.informed.formdata":{source:"iana",extensions:["ifm"]},"application/vnd.shana.informed.formtemplate":{source:"iana",extensions:["itp"]},"application/vnd.shana.informed.interchange":{source:"iana",extensions:["iif"]},"application/vnd.shana.informed.package":{source:"iana",extensions:["ipk"]},"application/vnd.shootproof+json":{source:"iana",compressible:!0},"application/vnd.shopkick+json":{source:"iana",compressible:!0},"application/vnd.shp":{source:"iana"},"application/vnd.shx":{source:"iana"},"application/vnd.sigrok.session":{source:"iana"},"application/vnd.simtech-mindmapper":{source:"iana",extensions:["twd","twds"]},"application/vnd.siren+json":{source:"iana",compressible:!0},"application/vnd.sketchometry":{source:"iana"},"application/vnd.smaf":{source:"iana",extensions:["mmf"]},"application/vnd.smart.notebook":{source:"iana"},"application/vnd.smart.teacher":{source:"iana",extensions:["teacher"]},"application/vnd.smintio.portals.archive":{source:"iana"},"application/vnd.snesdev-page-table":{source:"iana"},"application/vnd.software602.filler.form+xml":{source:"iana",compressible:!0,extensions:["fo"]},"application/vnd.software602.filler.form-xml-zip":{source:"iana"},"application/vnd.solent.sdkm+xml":{source:"iana",compressible:!0,extensions:["sdkm","sdkd"]},"application/vnd.spotfire.dxp":{source:"iana",extensions:["dxp"]},"application/vnd.spotfire.sfs":{source:"iana",extensions:["sfs"]},"application/vnd.sqlite3":{source:"iana"},"application/vnd.sss-cod":{source:"iana"},"application/vnd.sss-dtf":{source:"iana"},"application/vnd.sss-ntf":{source:"iana"},"application/vnd.stardivision.calc":{source:"apache",extensions:["sdc"]},"application/vnd.stardivision.draw":{source:"apache",extensions:["sda"]},"application/vnd.stardivision.impress":{source:"apache",extensions:["sdd"]},"application/vnd.stardivision.math":{source:"apache",extensions:["smf"]},"application/vnd.stardivision.writer":{source:"apache",extensions:["sdw","vor"]},"application/vnd.stardivision.writer-global":{source:"apache",extensions:["sgl"]},"application/vnd.stepmania.package":{source:"iana",extensions:["smzip"]},"application/vnd.stepmania.stepchart":{source:"iana",extensions:["sm"]},"application/vnd.street-stream":{source:"iana"},"application/vnd.sun.wadl+xml":{source:"iana",compressible:!0,extensions:["wadl"]},"application/vnd.sun.xml.calc":{source:"apache",extensions:["sxc"]},"application/vnd.sun.xml.calc.template":{source:"apache",extensions:["stc"]},"application/vnd.sun.xml.draw":{source:"apache",extensions:["sxd"]},"application/vnd.sun.xml.draw.template":{source:"apache",extensions:["std"]},"application/vnd.sun.xml.impress":{source:"apache",extensions:["sxi"]},"application/vnd.sun.xml.impress.template":{source:"apache",extensions:["sti"]},"application/vnd.sun.xml.math":{source:"apache",extensions:["sxm"]},"application/vnd.sun.xml.writer":{source:"apache",extensions:["sxw"]},"application/vnd.sun.xml.writer.global":{source:"apache",extensions:["sxg"]},"application/vnd.sun.xml.writer.template":{source:"apache",extensions:["stw"]},"application/vnd.sus-calendar":{source:"iana",extensions:["sus","susp"]},"application/vnd.svd":{source:"iana",extensions:["svd"]},"application/vnd.swiftview-ics":{source:"iana"},"application/vnd.sybyl.mol2":{source:"iana"},"application/vnd.sycle+xml":{source:"iana",compressible:!0},"application/vnd.syft+json":{source:"iana",compressible:!0},"application/vnd.symbian.install":{source:"apache",extensions:["sis","sisx"]},"application/vnd.syncml+xml":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["xsm"]},"application/vnd.syncml.dm+wbxml":{source:"iana",charset:"UTF-8",extensions:["bdm"]},"application/vnd.syncml.dm+xml":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["xdm"]},"application/vnd.syncml.dm.notification":{source:"iana"},"application/vnd.syncml.dmddf+wbxml":{source:"iana"},"application/vnd.syncml.dmddf+xml":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["ddf"]},"application/vnd.syncml.dmtnds+wbxml":{source:"iana"},"application/vnd.syncml.dmtnds+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/vnd.syncml.ds.notification":{source:"iana"},"application/vnd.tableschema+json":{source:"iana",compressible:!0},"application/vnd.tao.intent-module-archive":{source:"iana",extensions:["tao"]},"application/vnd.tcpdump.pcap":{source:"iana",extensions:["pcap","cap","dmp"]},"application/vnd.think-cell.ppttc+json":{source:"iana",compressible:!0},"application/vnd.tmd.mediaflex.api+xml":{source:"iana",compressible:!0},"application/vnd.tml":{source:"iana"},"application/vnd.tmobile-livetv":{source:"iana",extensions:["tmo"]},"application/vnd.tri.onesource":{source:"iana"},"application/vnd.trid.tpt":{source:"iana",extensions:["tpt"]},"application/vnd.triscape.mxs":{source:"iana",extensions:["mxs"]},"application/vnd.trueapp":{source:"iana",extensions:["tra"]},"application/vnd.truedoc":{source:"iana"},"application/vnd.ubisoft.webplayer":{source:"iana"},"application/vnd.ufdl":{source:"iana",extensions:["ufd","ufdl"]},"application/vnd.uic.osdm+json":{source:"iana",compressible:!0},"application/vnd.uiq.theme":{source:"iana",extensions:["utz"]},"application/vnd.umajin":{source:"iana",extensions:["umj"]},"application/vnd.unity":{source:"iana",extensions:["unityweb"]},"application/vnd.uoml+xml":{source:"iana",compressible:!0,extensions:["uoml","uo"]},"application/vnd.uplanet.alert":{source:"iana"},"application/vnd.uplanet.alert-wbxml":{source:"iana"},"application/vnd.uplanet.bearer-choice":{source:"iana"},"application/vnd.uplanet.bearer-choice-wbxml":{source:"iana"},"application/vnd.uplanet.cacheop":{source:"iana"},"application/vnd.uplanet.cacheop-wbxml":{source:"iana"},"application/vnd.uplanet.channel":{source:"iana"},"application/vnd.uplanet.channel-wbxml":{source:"iana"},"application/vnd.uplanet.list":{source:"iana"},"application/vnd.uplanet.list-wbxml":{source:"iana"},"application/vnd.uplanet.listcmd":{source:"iana"},"application/vnd.uplanet.listcmd-wbxml":{source:"iana"},"application/vnd.uplanet.signal":{source:"iana"},"application/vnd.uri-map":{source:"iana"},"application/vnd.valve.source.material":{source:"iana"},"application/vnd.vcx":{source:"iana",extensions:["vcx"]},"application/vnd.vd-study":{source:"iana"},"application/vnd.vectorworks":{source:"iana"},"application/vnd.vel+json":{source:"iana",compressible:!0},"application/vnd.veraison.tsm-report+cbor":{source:"iana"},"application/vnd.veraison.tsm-report+json":{source:"iana",compressible:!0},"application/vnd.verimatrix.vcas":{source:"iana"},"application/vnd.veritone.aion+json":{source:"iana",compressible:!0},"application/vnd.veryant.thin":{source:"iana"},"application/vnd.ves.encrypted":{source:"iana"},"application/vnd.vidsoft.vidconference":{source:"iana"},"application/vnd.visio":{source:"iana",extensions:["vsd","vst","vss","vsw","vsdx","vtx"]},"application/vnd.visionary":{source:"iana",extensions:["vis"]},"application/vnd.vividence.scriptfile":{source:"iana"},"application/vnd.vocalshaper.vsp4":{source:"iana"},"application/vnd.vsf":{source:"iana",extensions:["vsf"]},"application/vnd.wap.sic":{source:"iana"},"application/vnd.wap.slc":{source:"iana"},"application/vnd.wap.wbxml":{source:"iana",charset:"UTF-8",extensions:["wbxml"]},"application/vnd.wap.wmlc":{source:"iana",extensions:["wmlc"]},"application/vnd.wap.wmlscriptc":{source:"iana",extensions:["wmlsc"]},"application/vnd.wasmflow.wafl":{source:"iana"},"application/vnd.webturbo":{source:"iana",extensions:["wtb"]},"application/vnd.wfa.dpp":{source:"iana"},"application/vnd.wfa.p2p":{source:"iana"},"application/vnd.wfa.wsc":{source:"iana"},"application/vnd.windows.devicepairing":{source:"iana"},"application/vnd.wmc":{source:"iana"},"application/vnd.wmf.bootstrap":{source:"iana"},"application/vnd.wolfram.mathematica":{source:"iana"},"application/vnd.wolfram.mathematica.package":{source:"iana"},"application/vnd.wolfram.player":{source:"iana",extensions:["nbp"]},"application/vnd.wordlift":{source:"iana"},"application/vnd.wordperfect":{source:"iana",extensions:["wpd"]},"application/vnd.wqd":{source:"iana",extensions:["wqd"]},"application/vnd.wrq-hp3000-labelled":{source:"iana"},"application/vnd.wt.stf":{source:"iana",extensions:["stf"]},"application/vnd.wv.csp+wbxml":{source:"iana"},"application/vnd.wv.csp+xml":{source:"iana",compressible:!0},"application/vnd.wv.ssp+xml":{source:"iana",compressible:!0},"application/vnd.xacml+json":{source:"iana",compressible:!0},"application/vnd.xara":{source:"iana",extensions:["xar"]},"application/vnd.xarin.cpj":{source:"iana"},"application/vnd.xecrets-encrypted":{source:"iana"},"application/vnd.xfdl":{source:"iana",extensions:["xfdl"]},"application/vnd.xfdl.webform":{source:"iana"},"application/vnd.xmi+xml":{source:"iana",compressible:!0},"application/vnd.xmpie.cpkg":{source:"iana"},"application/vnd.xmpie.dpkg":{source:"iana"},"application/vnd.xmpie.plan":{source:"iana"},"application/vnd.xmpie.ppkg":{source:"iana"},"application/vnd.xmpie.xlim":{source:"iana"},"application/vnd.yamaha.hv-dic":{source:"iana",extensions:["hvd"]},"application/vnd.yamaha.hv-script":{source:"iana",extensions:["hvs"]},"application/vnd.yamaha.hv-voice":{source:"iana",extensions:["hvp"]},"application/vnd.yamaha.openscoreformat":{source:"iana",extensions:["osf"]},"application/vnd.yamaha.openscoreformat.osfpvg+xml":{source:"iana",compressible:!0,extensions:["osfpvg"]},"application/vnd.yamaha.remote-setup":{source:"iana"},"application/vnd.yamaha.smaf-audio":{source:"iana",extensions:["saf"]},"application/vnd.yamaha.smaf-phrase":{source:"iana",extensions:["spf"]},"application/vnd.yamaha.through-ngn":{source:"iana"},"application/vnd.yamaha.tunnel-udpencap":{source:"iana"},"application/vnd.yaoweme":{source:"iana"},"application/vnd.yellowriver-custom-menu":{source:"iana",extensions:["cmp"]},"application/vnd.zul":{source:"iana",extensions:["zir","zirz"]},"application/vnd.zzazz.deck+xml":{source:"iana",compressible:!0,extensions:["zaz"]},"application/voicexml+xml":{source:"iana",compressible:!0,extensions:["vxml"]},"application/voucher-cms+json":{source:"iana",compressible:!0},"application/voucher-jws+json":{source:"iana",compressible:!0},"application/vp":{source:"iana"},"application/vp+cose":{source:"iana"},"application/vp+jwt":{source:"iana"},"application/vq-rtcpxr":{source:"iana"},"application/wasm":{source:"iana",compressible:!0,extensions:["wasm"]},"application/watcherinfo+xml":{source:"iana",compressible:!0,extensions:["wif"]},"application/webpush-options+json":{source:"iana",compressible:!0},"application/whoispp-query":{source:"iana"},"application/whoispp-response":{source:"iana"},"application/widget":{source:"iana",extensions:["wgt"]},"application/winhlp":{source:"apache",extensions:["hlp"]},"application/wita":{source:"iana"},"application/wordperfect5.1":{source:"iana"},"application/wsdl+xml":{source:"iana",compressible:!0,extensions:["wsdl"]},"application/wspolicy+xml":{source:"iana",compressible:!0,extensions:["wspolicy"]},"application/x-7z-compressed":{source:"apache",compressible:!1,extensions:["7z"]},"application/x-abiword":{source:"apache",extensions:["abw"]},"application/x-ace-compressed":{source:"apache",extensions:["ace"]},"application/x-amf":{source:"apache"},"application/x-apple-diskimage":{source:"apache",extensions:["dmg"]},"application/x-arj":{compressible:!1,extensions:["arj"]},"application/x-authorware-bin":{source:"apache",extensions:["aab","x32","u32","vox"]},"application/x-authorware-map":{source:"apache",extensions:["aam"]},"application/x-authorware-seg":{source:"apache",extensions:["aas"]},"application/x-bcpio":{source:"apache",extensions:["bcpio"]},"application/x-bdoc":{compressible:!1,extensions:["bdoc"]},"application/x-bittorrent":{source:"apache",extensions:["torrent"]},"application/x-blender":{extensions:["blend"]},"application/x-blorb":{source:"apache",extensions:["blb","blorb"]},"application/x-bzip":{source:"apache",compressible:!1,extensions:["bz"]},"application/x-bzip2":{source:"apache",compressible:!1,extensions:["bz2","boz"]},"application/x-cbr":{source:"apache",extensions:["cbr","cba","cbt","cbz","cb7"]},"application/x-cdlink":{source:"apache",extensions:["vcd"]},"application/x-cfs-compressed":{source:"apache",extensions:["cfs"]},"application/x-chat":{source:"apache",extensions:["chat"]},"application/x-chess-pgn":{source:"apache",extensions:["pgn"]},"application/x-chrome-extension":{extensions:["crx"]},"application/x-cocoa":{source:"nginx",extensions:["cco"]},"application/x-compress":{source:"apache"},"application/x-compressed":{extensions:["rar"]},"application/x-conference":{source:"apache",extensions:["nsc"]},"application/x-cpio":{source:"apache",extensions:["cpio"]},"application/x-csh":{source:"apache",extensions:["csh"]},"application/x-deb":{compressible:!1},"application/x-debian-package":{source:"apache",extensions:["deb","udeb"]},"application/x-dgc-compressed":{source:"apache",extensions:["dgc"]},"application/x-director":{source:"apache",extensions:["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]},"application/x-doom":{source:"apache",extensions:["wad"]},"application/x-dtbncx+xml":{source:"apache",compressible:!0,extensions:["ncx"]},"application/x-dtbook+xml":{source:"apache",compressible:!0,extensions:["dtb"]},"application/x-dtbresource+xml":{source:"apache",compressible:!0,extensions:["res"]},"application/x-dvi":{source:"apache",compressible:!1,extensions:["dvi"]},"application/x-envoy":{source:"apache",extensions:["evy"]},"application/x-eva":{source:"apache",extensions:["eva"]},"application/x-font-bdf":{source:"apache",extensions:["bdf"]},"application/x-font-dos":{source:"apache"},"application/x-font-framemaker":{source:"apache"},"application/x-font-ghostscript":{source:"apache",extensions:["gsf"]},"application/x-font-libgrx":{source:"apache"},"application/x-font-linux-psf":{source:"apache",extensions:["psf"]},"application/x-font-pcf":{source:"apache",extensions:["pcf"]},"application/x-font-snf":{source:"apache",extensions:["snf"]},"application/x-font-speedo":{source:"apache"},"application/x-font-sunos-news":{source:"apache"},"application/x-font-type1":{source:"apache",extensions:["pfa","pfb","pfm","afm"]},"application/x-font-vfont":{source:"apache"},"application/x-freearc":{source:"apache",extensions:["arc"]},"application/x-futuresplash":{source:"apache",extensions:["spl"]},"application/x-gca-compressed":{source:"apache",extensions:["gca"]},"application/x-glulx":{source:"apache",extensions:["ulx"]},"application/x-gnumeric":{source:"apache",extensions:["gnumeric"]},"application/x-gramps-xml":{source:"apache",extensions:["gramps"]},"application/x-gtar":{source:"apache",extensions:["gtar"]},"application/x-gzip":{source:"apache"},"application/x-hdf":{source:"apache",extensions:["hdf"]},"application/x-httpd-php":{compressible:!0,extensions:["php"]},"application/x-install-instructions":{source:"apache",extensions:["install"]},"application/x-ipynb+json":{compressible:!0,extensions:["ipynb"]},"application/x-iso9660-image":{source:"apache",extensions:["iso"]},"application/x-iwork-keynote-sffkey":{extensions:["key"]},"application/x-iwork-numbers-sffnumbers":{extensions:["numbers"]},"application/x-iwork-pages-sffpages":{extensions:["pages"]},"application/x-java-archive-diff":{source:"nginx",extensions:["jardiff"]},"application/x-java-jnlp-file":{source:"apache",compressible:!1,extensions:["jnlp"]},"application/x-javascript":{compressible:!0},"application/x-keepass2":{extensions:["kdbx"]},"application/x-latex":{source:"apache",compressible:!1,extensions:["latex"]},"application/x-lua-bytecode":{extensions:["luac"]},"application/x-lzh-compressed":{source:"apache",extensions:["lzh","lha"]},"application/x-makeself":{source:"nginx",extensions:["run"]},"application/x-mie":{source:"apache",extensions:["mie"]},"application/x-mobipocket-ebook":{source:"apache",extensions:["prc","mobi"]},"application/x-mpegurl":{compressible:!1},"application/x-ms-application":{source:"apache",extensions:["application"]},"application/x-ms-shortcut":{source:"apache",extensions:["lnk"]},"application/x-ms-wmd":{source:"apache",extensions:["wmd"]},"application/x-ms-wmz":{source:"apache",extensions:["wmz"]},"application/x-ms-xbap":{source:"apache",extensions:["xbap"]},"application/x-msaccess":{source:"apache",extensions:["mdb"]},"application/x-msbinder":{source:"apache",extensions:["obd"]},"application/x-mscardfile":{source:"apache",extensions:["crd"]},"application/x-msclip":{source:"apache",extensions:["clp"]},"application/x-msdos-program":{extensions:["exe"]},"application/x-msdownload":{source:"apache",extensions:["exe","dll","com","bat","msi"]},"application/x-msmediaview":{source:"apache",extensions:["mvb","m13","m14"]},"application/x-msmetafile":{source:"apache",extensions:["wmf","wmz","emf","emz"]},"application/x-msmoney":{source:"apache",extensions:["mny"]},"application/x-mspublisher":{source:"apache",extensions:["pub"]},"application/x-msschedule":{source:"apache",extensions:["scd"]},"application/x-msterminal":{source:"apache",extensions:["trm"]},"application/x-mswrite":{source:"apache",extensions:["wri"]},"application/x-netcdf":{source:"apache",extensions:["nc","cdf"]},"application/x-ns-proxy-autoconfig":{compressible:!0,extensions:["pac"]},"application/x-nzb":{source:"apache",extensions:["nzb"]},"application/x-perl":{source:"nginx",extensions:["pl","pm"]},"application/x-pilot":{source:"nginx",extensions:["prc","pdb"]},"application/x-pkcs12":{source:"apache",compressible:!1,extensions:["p12","pfx"]},"application/x-pkcs7-certificates":{source:"apache",extensions:["p7b","spc"]},"application/x-pkcs7-certreqresp":{source:"apache",extensions:["p7r"]},"application/x-pki-message":{source:"iana"},"application/x-rar-compressed":{source:"apache",compressible:!1,extensions:["rar"]},"application/x-redhat-package-manager":{source:"nginx",extensions:["rpm"]},"application/x-research-info-systems":{source:"apache",extensions:["ris"]},"application/x-sea":{source:"nginx",extensions:["sea"]},"application/x-sh":{source:"apache",compressible:!0,extensions:["sh"]},"application/x-shar":{source:"apache",extensions:["shar"]},"application/x-shockwave-flash":{source:"apache",compressible:!1,extensions:["swf"]},"application/x-silverlight-app":{source:"apache",extensions:["xap"]},"application/x-sql":{source:"apache",extensions:["sql"]},"application/x-stuffit":{source:"apache",compressible:!1,extensions:["sit"]},"application/x-stuffitx":{source:"apache",extensions:["sitx"]},"application/x-subrip":{source:"apache",extensions:["srt"]},"application/x-sv4cpio":{source:"apache",extensions:["sv4cpio"]},"application/x-sv4crc":{source:"apache",extensions:["sv4crc"]},"application/x-t3vm-image":{source:"apache",extensions:["t3"]},"application/x-tads":{source:"apache",extensions:["gam"]},"application/x-tar":{source:"apache",compressible:!0,extensions:["tar"]},"application/x-tcl":{source:"apache",extensions:["tcl","tk"]},"application/x-tex":{source:"apache",extensions:["tex"]},"application/x-tex-tfm":{source:"apache",extensions:["tfm"]},"application/x-texinfo":{source:"apache",extensions:["texinfo","texi"]},"application/x-tgif":{source:"apache",extensions:["obj"]},"application/x-ustar":{source:"apache",extensions:["ustar"]},"application/x-virtualbox-hdd":{compressible:!0,extensions:["hdd"]},"application/x-virtualbox-ova":{compressible:!0,extensions:["ova"]},"application/x-virtualbox-ovf":{compressible:!0,extensions:["ovf"]},"application/x-virtualbox-vbox":{compressible:!0,extensions:["vbox"]},"application/x-virtualbox-vbox-extpack":{compressible:!1,extensions:["vbox-extpack"]},"application/x-virtualbox-vdi":{compressible:!0,extensions:["vdi"]},"application/x-virtualbox-vhd":{compressible:!0,extensions:["vhd"]},"application/x-virtualbox-vmdk":{compressible:!0,extensions:["vmdk"]},"application/x-wais-source":{source:"apache",extensions:["src"]},"application/x-web-app-manifest+json":{compressible:!0,extensions:["webapp"]},"application/x-www-form-urlencoded":{source:"iana",compressible:!0},"application/x-x509-ca-cert":{source:"iana",extensions:["der","crt","pem"]},"application/x-x509-ca-ra-cert":{source:"iana"},"application/x-x509-next-ca-cert":{source:"iana"},"application/x-xfig":{source:"apache",extensions:["fig"]},"application/x-xliff+xml":{source:"apache",compressible:!0,extensions:["xlf"]},"application/x-xpinstall":{source:"apache",compressible:!1,extensions:["xpi"]},"application/x-xz":{source:"apache",extensions:["xz"]},"application/x-zip-compressed":{extensions:["zip"]},"application/x-zmachine":{source:"apache",extensions:["z1","z2","z3","z4","z5","z6","z7","z8"]},"application/x400-bp":{source:"iana"},"application/xacml+xml":{source:"iana",compressible:!0},"application/xaml+xml":{source:"apache",compressible:!0,extensions:["xaml"]},"application/xcap-att+xml":{source:"iana",compressible:!0,extensions:["xav"]},"application/xcap-caps+xml":{source:"iana",compressible:!0,extensions:["xca"]},"application/xcap-diff+xml":{source:"iana",compressible:!0,extensions:["xdf"]},"application/xcap-el+xml":{source:"iana",compressible:!0,extensions:["xel"]},"application/xcap-error+xml":{source:"iana",compressible:!0},"application/xcap-ns+xml":{source:"iana",compressible:!0,extensions:["xns"]},"application/xcon-conference-info+xml":{source:"iana",compressible:!0},"application/xcon-conference-info-diff+xml":{source:"iana",compressible:!0},"application/xenc+xml":{source:"iana",compressible:!0,extensions:["xenc"]},"application/xfdf":{source:"iana",extensions:["xfdf"]},"application/xhtml+xml":{source:"iana",compressible:!0,extensions:["xhtml","xht"]},"application/xhtml-voice+xml":{source:"apache",compressible:!0},"application/xliff+xml":{source:"iana",compressible:!0,extensions:["xlf"]},"application/xml":{source:"iana",compressible:!0,extensions:["xml","xsl","xsd","rng"]},"application/xml-dtd":{source:"iana",compressible:!0,extensions:["dtd"]},"application/xml-external-parsed-entity":{source:"iana"},"application/xml-patch+xml":{source:"iana",compressible:!0},"application/xmpp+xml":{source:"iana",compressible:!0},"application/xop+xml":{source:"iana",compressible:!0,extensions:["xop"]},"application/xproc+xml":{source:"apache",compressible:!0,extensions:["xpl"]},"application/xslt+xml":{source:"iana",compressible:!0,extensions:["xsl","xslt"]},"application/xspf+xml":{source:"apache",compressible:!0,extensions:["xspf"]},"application/xv+xml":{source:"iana",compressible:!0,extensions:["mxml","xhvml","xvml","xvm"]},"application/yaml":{source:"iana"},"application/yang":{source:"iana",extensions:["yang"]},"application/yang-data+cbor":{source:"iana"},"application/yang-data+json":{source:"iana",compressible:!0},"application/yang-data+xml":{source:"iana",compressible:!0},"application/yang-patch+json":{source:"iana",compressible:!0},"application/yang-patch+xml":{source:"iana",compressible:!0},"application/yang-sid+json":{source:"iana",compressible:!0},"application/yin+xml":{source:"iana",compressible:!0,extensions:["yin"]},"application/zip":{source:"iana",compressible:!1,extensions:["zip"]},"application/zip+dotlottie":{extensions:["lottie"]},"application/zlib":{source:"iana"},"application/zstd":{source:"iana"},"audio/1d-interleaved-parityfec":{source:"iana"},"audio/32kadpcm":{source:"iana"},"audio/3gpp":{source:"iana",compressible:!1,extensions:["3gpp"]},"audio/3gpp2":{source:"iana"},"audio/aac":{source:"iana",extensions:["adts","aac"]},"audio/ac3":{source:"iana"},"audio/adpcm":{source:"apache",extensions:["adp"]},"audio/amr":{source:"iana",extensions:["amr"]},"audio/amr-wb":{source:"iana"},"audio/amr-wb+":{source:"iana"},"audio/aptx":{source:"iana"},"audio/asc":{source:"iana"},"audio/atrac-advanced-lossless":{source:"iana"},"audio/atrac-x":{source:"iana"},"audio/atrac3":{source:"iana"},"audio/basic":{source:"iana",compressible:!1,extensions:["au","snd"]},"audio/bv16":{source:"iana"},"audio/bv32":{source:"iana"},"audio/clearmode":{source:"iana"},"audio/cn":{source:"iana"},"audio/dat12":{source:"iana"},"audio/dls":{source:"iana"},"audio/dsr-es201108":{source:"iana"},"audio/dsr-es202050":{source:"iana"},"audio/dsr-es202211":{source:"iana"},"audio/dsr-es202212":{source:"iana"},"audio/dv":{source:"iana"},"audio/dvi4":{source:"iana"},"audio/eac3":{source:"iana"},"audio/encaprtp":{source:"iana"},"audio/evrc":{source:"iana"},"audio/evrc-qcp":{source:"iana"},"audio/evrc0":{source:"iana"},"audio/evrc1":{source:"iana"},"audio/evrcb":{source:"iana"},"audio/evrcb0":{source:"iana"},"audio/evrcb1":{source:"iana"},"audio/evrcnw":{source:"iana"},"audio/evrcnw0":{source:"iana"},"audio/evrcnw1":{source:"iana"},"audio/evrcwb":{source:"iana"},"audio/evrcwb0":{source:"iana"},"audio/evrcwb1":{source:"iana"},"audio/evs":{source:"iana"},"audio/flac":{source:"iana"},"audio/flexfec":{source:"iana"},"audio/fwdred":{source:"iana"},"audio/g711-0":{source:"iana"},"audio/g719":{source:"iana"},"audio/g722":{source:"iana"},"audio/g7221":{source:"iana"},"audio/g723":{source:"iana"},"audio/g726-16":{source:"iana"},"audio/g726-24":{source:"iana"},"audio/g726-32":{source:"iana"},"audio/g726-40":{source:"iana"},"audio/g728":{source:"iana"},"audio/g729":{source:"iana"},"audio/g7291":{source:"iana"},"audio/g729d":{source:"iana"},"audio/g729e":{source:"iana"},"audio/gsm":{source:"iana"},"audio/gsm-efr":{source:"iana"},"audio/gsm-hr-08":{source:"iana"},"audio/ilbc":{source:"iana"},"audio/ip-mr_v2.5":{source:"iana"},"audio/isac":{source:"apache"},"audio/l16":{source:"iana"},"audio/l20":{source:"iana"},"audio/l24":{source:"iana",compressible:!1},"audio/l8":{source:"iana"},"audio/lpc":{source:"iana"},"audio/matroska":{source:"iana"},"audio/melp":{source:"iana"},"audio/melp1200":{source:"iana"},"audio/melp2400":{source:"iana"},"audio/melp600":{source:"iana"},"audio/mhas":{source:"iana"},"audio/midi":{source:"apache",extensions:["mid","midi","kar","rmi"]},"audio/midi-clip":{source:"iana"},"audio/mobile-xmf":{source:"iana",extensions:["mxmf"]},"audio/mp3":{compressible:!1,extensions:["mp3"]},"audio/mp4":{source:"iana",compressible:!1,extensions:["m4a","mp4a","m4b"]},"audio/mp4a-latm":{source:"iana"},"audio/mpa":{source:"iana"},"audio/mpa-robust":{source:"iana"},"audio/mpeg":{source:"iana",compressible:!1,extensions:["mpga","mp2","mp2a","mp3","m2a","m3a"]},"audio/mpeg4-generic":{source:"iana"},"audio/musepack":{source:"apache"},"audio/ogg":{source:"iana",compressible:!1,extensions:["oga","ogg","spx","opus"]},"audio/opus":{source:"iana"},"audio/parityfec":{source:"iana"},"audio/pcma":{source:"iana"},"audio/pcma-wb":{source:"iana"},"audio/pcmu":{source:"iana"},"audio/pcmu-wb":{source:"iana"},"audio/prs.sid":{source:"iana"},"audio/qcelp":{source:"iana"},"audio/raptorfec":{source:"iana"},"audio/red":{source:"iana"},"audio/rtp-enc-aescm128":{source:"iana"},"audio/rtp-midi":{source:"iana"},"audio/rtploopback":{source:"iana"},"audio/rtx":{source:"iana"},"audio/s3m":{source:"apache",extensions:["s3m"]},"audio/scip":{source:"iana"},"audio/silk":{source:"apache",extensions:["sil"]},"audio/smv":{source:"iana"},"audio/smv-qcp":{source:"iana"},"audio/smv0":{source:"iana"},"audio/sofa":{source:"iana"},"audio/sp-midi":{source:"iana"},"audio/speex":{source:"iana"},"audio/t140c":{source:"iana"},"audio/t38":{source:"iana"},"audio/telephone-event":{source:"iana"},"audio/tetra_acelp":{source:"iana"},"audio/tetra_acelp_bb":{source:"iana"},"audio/tone":{source:"iana"},"audio/tsvcis":{source:"iana"},"audio/uemclip":{source:"iana"},"audio/ulpfec":{source:"iana"},"audio/usac":{source:"iana"},"audio/vdvi":{source:"iana"},"audio/vmr-wb":{source:"iana"},"audio/vnd.3gpp.iufp":{source:"iana"},"audio/vnd.4sb":{source:"iana"},"audio/vnd.audiokoz":{source:"iana"},"audio/vnd.celp":{source:"iana"},"audio/vnd.cisco.nse":{source:"iana"},"audio/vnd.cmles.radio-events":{source:"iana"},"audio/vnd.cns.anp1":{source:"iana"},"audio/vnd.cns.inf1":{source:"iana"},"audio/vnd.dece.audio":{source:"iana",extensions:["uva","uvva"]},"audio/vnd.digital-winds":{source:"iana",extensions:["eol"]},"audio/vnd.dlna.adts":{source:"iana"},"audio/vnd.dolby.heaac.1":{source:"iana"},"audio/vnd.dolby.heaac.2":{source:"iana"},"audio/vnd.dolby.mlp":{source:"iana"},"audio/vnd.dolby.mps":{source:"iana"},"audio/vnd.dolby.pl2":{source:"iana"},"audio/vnd.dolby.pl2x":{source:"iana"},"audio/vnd.dolby.pl2z":{source:"iana"},"audio/vnd.dolby.pulse.1":{source:"iana"},"audio/vnd.dra":{source:"iana",extensions:["dra"]},"audio/vnd.dts":{source:"iana",extensions:["dts"]},"audio/vnd.dts.hd":{source:"iana",extensions:["dtshd"]},"audio/vnd.dts.uhd":{source:"iana"},"audio/vnd.dvb.file":{source:"iana"},"audio/vnd.everad.plj":{source:"iana"},"audio/vnd.hns.audio":{source:"iana"},"audio/vnd.lucent.voice":{source:"iana",extensions:["lvp"]},"audio/vnd.ms-playready.media.pya":{source:"iana",extensions:["pya"]},"audio/vnd.nokia.mobile-xmf":{source:"iana"},"audio/vnd.nortel.vbk":{source:"iana"},"audio/vnd.nuera.ecelp4800":{source:"iana",extensions:["ecelp4800"]},"audio/vnd.nuera.ecelp7470":{source:"iana",extensions:["ecelp7470"]},"audio/vnd.nuera.ecelp9600":{source:"iana",extensions:["ecelp9600"]},"audio/vnd.octel.sbc":{source:"iana"},"audio/vnd.presonus.multitrack":{source:"iana"},"audio/vnd.qcelp":{source:"apache"},"audio/vnd.rhetorex.32kadpcm":{source:"iana"},"audio/vnd.rip":{source:"iana",extensions:["rip"]},"audio/vnd.rn-realaudio":{compressible:!1},"audio/vnd.sealedmedia.softseal.mpeg":{source:"iana"},"audio/vnd.vmx.cvsd":{source:"iana"},"audio/vnd.wave":{compressible:!1},"audio/vorbis":{source:"iana",compressible:!1},"audio/vorbis-config":{source:"iana"},"audio/wav":{compressible:!1,extensions:["wav"]},"audio/wave":{compressible:!1,extensions:["wav"]},"audio/webm":{source:"apache",compressible:!1,extensions:["weba"]},"audio/x-aac":{source:"apache",compressible:!1,extensions:["aac"]},"audio/x-aiff":{source:"apache",extensions:["aif","aiff","aifc"]},"audio/x-caf":{source:"apache",compressible:!1,extensions:["caf"]},"audio/x-flac":{source:"apache",extensions:["flac"]},"audio/x-m4a":{source:"nginx",extensions:["m4a"]},"audio/x-matroska":{source:"apache",extensions:["mka"]},"audio/x-mpegurl":{source:"apache",extensions:["m3u"]},"audio/x-ms-wax":{source:"apache",extensions:["wax"]},"audio/x-ms-wma":{source:"apache",extensions:["wma"]},"audio/x-pn-realaudio":{source:"apache",extensions:["ram","ra"]},"audio/x-pn-realaudio-plugin":{source:"apache",extensions:["rmp"]},"audio/x-realaudio":{source:"nginx",extensions:["ra"]},"audio/x-tta":{source:"apache"},"audio/x-wav":{source:"apache",extensions:["wav"]},"audio/xm":{source:"apache",extensions:["xm"]},"chemical/x-cdx":{source:"apache",extensions:["cdx"]},"chemical/x-cif":{source:"apache",extensions:["cif"]},"chemical/x-cmdf":{source:"apache",extensions:["cmdf"]},"chemical/x-cml":{source:"apache",extensions:["cml"]},"chemical/x-csml":{source:"apache",extensions:["csml"]},"chemical/x-pdb":{source:"apache"},"chemical/x-xyz":{source:"apache",extensions:["xyz"]},"font/collection":{source:"iana",extensions:["ttc"]},"font/otf":{source:"iana",compressible:!0,extensions:["otf"]},"font/sfnt":{source:"iana"},"font/ttf":{source:"iana",compressible:!0,extensions:["ttf"]},"font/woff":{source:"iana",extensions:["woff"]},"font/woff2":{source:"iana",extensions:["woff2"]},"image/aces":{source:"iana",extensions:["exr"]},"image/apng":{source:"iana",compressible:!1,extensions:["apng"]},"image/avci":{source:"iana",extensions:["avci"]},"image/avcs":{source:"iana",extensions:["avcs"]},"image/avif":{source:"iana",compressible:!1,extensions:["avif"]},"image/bmp":{source:"iana",compressible:!0,extensions:["bmp","dib"]},"image/cgm":{source:"iana",extensions:["cgm"]},"image/dicom-rle":{source:"iana",extensions:["drle"]},"image/dpx":{source:"iana",extensions:["dpx"]},"image/emf":{source:"iana",extensions:["emf"]},"image/fits":{source:"iana",extensions:["fits"]},"image/g3fax":{source:"iana",extensions:["g3"]},"image/gif":{source:"iana",compressible:!1,extensions:["gif"]},"image/heic":{source:"iana",extensions:["heic"]},"image/heic-sequence":{source:"iana",extensions:["heics"]},"image/heif":{source:"iana",extensions:["heif"]},"image/heif-sequence":{source:"iana",extensions:["heifs"]},"image/hej2k":{source:"iana",extensions:["hej2"]},"image/ief":{source:"iana",extensions:["ief"]},"image/j2c":{source:"iana"},"image/jaii":{source:"iana",extensions:["jaii"]},"image/jais":{source:"iana",extensions:["jais"]},"image/jls":{source:"iana",extensions:["jls"]},"image/jp2":{source:"iana",compressible:!1,extensions:["jp2","jpg2"]},"image/jpeg":{source:"iana",compressible:!1,extensions:["jpg","jpeg","jpe"]},"image/jph":{source:"iana",extensions:["jph"]},"image/jphc":{source:"iana",extensions:["jhc"]},"image/jpm":{source:"iana",compressible:!1,extensions:["jpm","jpgm"]},"image/jpx":{source:"iana",compressible:!1,extensions:["jpx","jpf"]},"image/jxl":{source:"iana",extensions:["jxl"]},"image/jxr":{source:"iana",extensions:["jxr"]},"image/jxra":{source:"iana",extensions:["jxra"]},"image/jxrs":{source:"iana",extensions:["jxrs"]},"image/jxs":{source:"iana",extensions:["jxs"]},"image/jxsc":{source:"iana",extensions:["jxsc"]},"image/jxsi":{source:"iana",extensions:["jxsi"]},"image/jxss":{source:"iana",extensions:["jxss"]},"image/ktx":{source:"iana",extensions:["ktx"]},"image/ktx2":{source:"iana",extensions:["ktx2"]},"image/naplps":{source:"iana"},"image/pjpeg":{compressible:!1,extensions:["jfif"]},"image/png":{source:"iana",compressible:!1,extensions:["png"]},"image/prs.btif":{source:"iana",extensions:["btif","btf"]},"image/prs.pti":{source:"iana",extensions:["pti"]},"image/pwg-raster":{source:"iana"},"image/sgi":{source:"apache",extensions:["sgi"]},"image/svg+xml":{source:"iana",compressible:!0,extensions:["svg","svgz"]},"image/t38":{source:"iana",extensions:["t38"]},"image/tiff":{source:"iana",compressible:!1,extensions:["tif","tiff"]},"image/tiff-fx":{source:"iana",extensions:["tfx"]},"image/vnd.adobe.photoshop":{source:"iana",compressible:!0,extensions:["psd"]},"image/vnd.airzip.accelerator.azv":{source:"iana",extensions:["azv"]},"image/vnd.clip":{source:"iana"},"image/vnd.cns.inf2":{source:"iana"},"image/vnd.dece.graphic":{source:"iana",extensions:["uvi","uvvi","uvg","uvvg"]},"image/vnd.djvu":{source:"iana",extensions:["djvu","djv"]},"image/vnd.dvb.subtitle":{source:"iana",extensions:["sub"]},"image/vnd.dwg":{source:"iana",extensions:["dwg"]},"image/vnd.dxf":{source:"iana",extensions:["dxf"]},"image/vnd.fastbidsheet":{source:"iana",extensions:["fbs"]},"image/vnd.fpx":{source:"iana",extensions:["fpx"]},"image/vnd.fst":{source:"iana",extensions:["fst"]},"image/vnd.fujixerox.edmics-mmr":{source:"iana",extensions:["mmr"]},"image/vnd.fujixerox.edmics-rlc":{source:"iana",extensions:["rlc"]},"image/vnd.globalgraphics.pgb":{source:"iana"},"image/vnd.microsoft.icon":{source:"iana",compressible:!0,extensions:["ico"]},"image/vnd.mix":{source:"iana"},"image/vnd.mozilla.apng":{source:"iana"},"image/vnd.ms-dds":{compressible:!0,extensions:["dds"]},"image/vnd.ms-modi":{source:"iana",extensions:["mdi"]},"image/vnd.ms-photo":{source:"apache",extensions:["wdp"]},"image/vnd.net-fpx":{source:"iana",extensions:["npx"]},"image/vnd.pco.b16":{source:"iana",extensions:["b16"]},"image/vnd.radiance":{source:"iana"},"image/vnd.sealed.png":{source:"iana"},"image/vnd.sealedmedia.softseal.gif":{source:"iana"},"image/vnd.sealedmedia.softseal.jpg":{source:"iana"},"image/vnd.svf":{source:"iana"},"image/vnd.tencent.tap":{source:"iana",extensions:["tap"]},"image/vnd.valve.source.texture":{source:"iana",extensions:["vtf"]},"image/vnd.wap.wbmp":{source:"iana",extensions:["wbmp"]},"image/vnd.xiff":{source:"iana",extensions:["xif"]},"image/vnd.zbrush.pcx":{source:"iana",extensions:["pcx"]},"image/webp":{source:"iana",extensions:["webp"]},"image/wmf":{source:"iana",extensions:["wmf"]},"image/x-3ds":{source:"apache",extensions:["3ds"]},"image/x-adobe-dng":{extensions:["dng"]},"image/x-cmu-raster":{source:"apache",extensions:["ras"]},"image/x-cmx":{source:"apache",extensions:["cmx"]},"image/x-emf":{source:"iana"},"image/x-freehand":{source:"apache",extensions:["fh","fhc","fh4","fh5","fh7"]},"image/x-icon":{source:"apache",compressible:!0,extensions:["ico"]},"image/x-jng":{source:"nginx",extensions:["jng"]},"image/x-mrsid-image":{source:"apache",extensions:["sid"]},"image/x-ms-bmp":{source:"nginx",compressible:!0,extensions:["bmp"]},"image/x-pcx":{source:"apache",extensions:["pcx"]},"image/x-pict":{source:"apache",extensions:["pic","pct"]},"image/x-portable-anymap":{source:"apache",extensions:["pnm"]},"image/x-portable-bitmap":{source:"apache",extensions:["pbm"]},"image/x-portable-graymap":{source:"apache",extensions:["pgm"]},"image/x-portable-pixmap":{source:"apache",extensions:["ppm"]},"image/x-rgb":{source:"apache",extensions:["rgb"]},"image/x-tga":{source:"apache",extensions:["tga"]},"image/x-wmf":{source:"iana"},"image/x-xbitmap":{source:"apache",extensions:["xbm"]},"image/x-xcf":{compressible:!1},"image/x-xpixmap":{source:"apache",extensions:["xpm"]},"image/x-xwindowdump":{source:"apache",extensions:["xwd"]},"message/bhttp":{source:"iana"},"message/cpim":{source:"iana"},"message/delivery-status":{source:"iana"},"message/disposition-notification":{source:"iana",extensions:["disposition-notification"]},"message/external-body":{source:"iana"},"message/feedback-report":{source:"iana"},"message/global":{source:"iana",extensions:["u8msg"]},"message/global-delivery-status":{source:"iana",extensions:["u8dsn"]},"message/global-disposition-notification":{source:"iana",extensions:["u8mdn"]},"message/global-headers":{source:"iana",extensions:["u8hdr"]},"message/http":{source:"iana",compressible:!1},"message/imdn+xml":{source:"iana",compressible:!0},"message/mls":{source:"iana"},"message/news":{source:"apache"},"message/ohttp-req":{source:"iana"},"message/ohttp-res":{source:"iana"},"message/partial":{source:"iana",compressible:!1},"message/rfc822":{source:"iana",compressible:!0,extensions:["eml","mime","mht","mhtml"]},"message/s-http":{source:"apache"},"message/sip":{source:"iana"},"message/sipfrag":{source:"iana"},"message/tracking-status":{source:"iana"},"message/vnd.si.simp":{source:"apache"},"message/vnd.wfa.wsc":{source:"iana",extensions:["wsc"]},"model/3mf":{source:"iana",extensions:["3mf"]},"model/e57":{source:"iana"},"model/gltf+json":{source:"iana",compressible:!0,extensions:["gltf"]},"model/gltf-binary":{source:"iana",compressible:!0,extensions:["glb"]},"model/iges":{source:"iana",compressible:!1,extensions:["igs","iges"]},"model/jt":{source:"iana",extensions:["jt"]},"model/mesh":{source:"iana",compressible:!1,extensions:["msh","mesh","silo"]},"model/mtl":{source:"iana",extensions:["mtl"]},"model/obj":{source:"iana",extensions:["obj"]},"model/prc":{source:"iana",extensions:["prc"]},"model/step":{source:"iana",extensions:["step","stp","stpnc","p21","210"]},"model/step+xml":{source:"iana",compressible:!0,extensions:["stpx"]},"model/step+zip":{source:"iana",compressible:!1,extensions:["stpz"]},"model/step-xml+zip":{source:"iana",compressible:!1,extensions:["stpxz"]},"model/stl":{source:"iana",extensions:["stl"]},"model/u3d":{source:"iana",extensions:["u3d"]},"model/vnd.bary":{source:"iana",extensions:["bary"]},"model/vnd.cld":{source:"iana",extensions:["cld"]},"model/vnd.collada+xml":{source:"iana",compressible:!0,extensions:["dae"]},"model/vnd.dwf":{source:"iana",extensions:["dwf"]},"model/vnd.flatland.3dml":{source:"iana"},"model/vnd.gdl":{source:"iana",extensions:["gdl"]},"model/vnd.gs-gdl":{source:"apache"},"model/vnd.gs.gdl":{source:"iana"},"model/vnd.gtw":{source:"iana",extensions:["gtw"]},"model/vnd.moml+xml":{source:"iana",compressible:!0},"model/vnd.mts":{source:"iana",extensions:["mts"]},"model/vnd.opengex":{source:"iana",extensions:["ogex"]},"model/vnd.parasolid.transmit.binary":{source:"iana",extensions:["x_b"]},"model/vnd.parasolid.transmit.text":{source:"iana",extensions:["x_t"]},"model/vnd.pytha.pyox":{source:"iana",extensions:["pyo","pyox"]},"model/vnd.rosette.annotated-data-model":{source:"iana"},"model/vnd.sap.vds":{source:"iana",extensions:["vds"]},"model/vnd.usda":{source:"iana",extensions:["usda"]},"model/vnd.usdz+zip":{source:"iana",compressible:!1,extensions:["usdz"]},"model/vnd.valve.source.compiled-map":{source:"iana",extensions:["bsp"]},"model/vnd.vtu":{source:"iana",extensions:["vtu"]},"model/vrml":{source:"iana",compressible:!1,extensions:["wrl","vrml"]},"model/x3d+binary":{source:"apache",compressible:!1,extensions:["x3db","x3dbz"]},"model/x3d+fastinfoset":{source:"iana",extensions:["x3db"]},"model/x3d+vrml":{source:"apache",compressible:!1,extensions:["x3dv","x3dvz"]},"model/x3d+xml":{source:"iana",compressible:!0,extensions:["x3d","x3dz"]},"model/x3d-vrml":{source:"iana",extensions:["x3dv"]},"multipart/alternative":{source:"iana",compressible:!1},"multipart/appledouble":{source:"iana"},"multipart/byteranges":{source:"iana"},"multipart/digest":{source:"iana"},"multipart/encrypted":{source:"iana",compressible:!1},"multipart/form-data":{source:"iana",compressible:!1},"multipart/header-set":{source:"iana"},"multipart/mixed":{source:"iana"},"multipart/multilingual":{source:"iana"},"multipart/parallel":{source:"iana"},"multipart/related":{source:"iana",compressible:!1},"multipart/report":{source:"iana"},"multipart/signed":{source:"iana",compressible:!1},"multipart/vnd.bint.med-plus":{source:"iana"},"multipart/voice-message":{source:"iana"},"multipart/x-mixed-replace":{source:"iana"},"text/1d-interleaved-parityfec":{source:"iana"},"text/cache-manifest":{source:"iana",compressible:!0,extensions:["appcache","manifest"]},"text/calendar":{source:"iana",extensions:["ics","ifb"]},"text/calender":{compressible:!0},"text/cmd":{compressible:!0},"text/coffeescript":{extensions:["coffee","litcoffee"]},"text/cql":{source:"iana"},"text/cql-expression":{source:"iana"},"text/cql-identifier":{source:"iana"},"text/css":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["css"]},"text/csv":{source:"iana",compressible:!0,extensions:["csv"]},"text/csv-schema":{source:"iana"},"text/directory":{source:"iana"},"text/dns":{source:"iana"},"text/ecmascript":{source:"apache"},"text/encaprtp":{source:"iana"},"text/enriched":{source:"iana"},"text/fhirpath":{source:"iana"},"text/flexfec":{source:"iana"},"text/fwdred":{source:"iana"},"text/gff3":{source:"iana"},"text/grammar-ref-list":{source:"iana"},"text/hl7v2":{source:"iana"},"text/html":{source:"iana",compressible:!0,extensions:["html","htm","shtml"]},"text/jade":{extensions:["jade"]},"text/javascript":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["js","mjs"]},"text/jcr-cnd":{source:"iana"},"text/jsx":{compressible:!0,extensions:["jsx"]},"text/less":{compressible:!0,extensions:["less"]},"text/markdown":{source:"iana",compressible:!0,extensions:["md","markdown"]},"text/mathml":{source:"nginx",extensions:["mml"]},"text/mdx":{compressible:!0,extensions:["mdx"]},"text/mizar":{source:"iana"},"text/n3":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["n3"]},"text/parameters":{source:"iana",charset:"UTF-8"},"text/parityfec":{source:"iana"},"text/plain":{source:"iana",compressible:!0,extensions:["txt","text","conf","def","list","log","in","ini"]},"text/provenance-notation":{source:"iana",charset:"UTF-8"},"text/prs.fallenstein.rst":{source:"iana"},"text/prs.lines.tag":{source:"iana",extensions:["dsc"]},"text/prs.prop.logic":{source:"iana"},"text/prs.texi":{source:"iana"},"text/raptorfec":{source:"iana"},"text/red":{source:"iana"},"text/rfc822-headers":{source:"iana"},"text/richtext":{source:"iana",compressible:!0,extensions:["rtx"]},"text/rtf":{source:"iana",compressible:!0,extensions:["rtf"]},"text/rtp-enc-aescm128":{source:"iana"},"text/rtploopback":{source:"iana"},"text/rtx":{source:"iana"},"text/sgml":{source:"iana",extensions:["sgml","sgm"]},"text/shaclc":{source:"iana"},"text/shex":{source:"iana",extensions:["shex"]},"text/slim":{extensions:["slim","slm"]},"text/spdx":{source:"iana",extensions:["spdx"]},"text/strings":{source:"iana"},"text/stylus":{extensions:["stylus","styl"]},"text/t140":{source:"iana"},"text/tab-separated-values":{source:"iana",compressible:!0,extensions:["tsv"]},"text/troff":{source:"iana",extensions:["t","tr","roff","man","me","ms"]},"text/turtle":{source:"iana",charset:"UTF-8",extensions:["ttl"]},"text/ulpfec":{source:"iana"},"text/uri-list":{source:"iana",compressible:!0,extensions:["uri","uris","urls"]},"text/vcard":{source:"iana",compressible:!0,extensions:["vcard"]},"text/vnd.a":{source:"iana"},"text/vnd.abc":{source:"iana"},"text/vnd.ascii-art":{source:"iana"},"text/vnd.curl":{source:"iana",extensions:["curl"]},"text/vnd.curl.dcurl":{source:"apache",extensions:["dcurl"]},"text/vnd.curl.mcurl":{source:"apache",extensions:["mcurl"]},"text/vnd.curl.scurl":{source:"apache",extensions:["scurl"]},"text/vnd.debian.copyright":{source:"iana",charset:"UTF-8"},"text/vnd.dmclientscript":{source:"iana"},"text/vnd.dvb.subtitle":{source:"iana",extensions:["sub"]},"text/vnd.esmertec.theme-descriptor":{source:"iana",charset:"UTF-8"},"text/vnd.exchangeable":{source:"iana"},"text/vnd.familysearch.gedcom":{source:"iana",extensions:["ged"]},"text/vnd.ficlab.flt":{source:"iana"},"text/vnd.fly":{source:"iana",extensions:["fly"]},"text/vnd.fmi.flexstor":{source:"iana",extensions:["flx"]},"text/vnd.gml":{source:"iana"},"text/vnd.graphviz":{source:"iana",extensions:["gv"]},"text/vnd.hans":{source:"iana"},"text/vnd.hgl":{source:"iana"},"text/vnd.in3d.3dml":{source:"iana",extensions:["3dml"]},"text/vnd.in3d.spot":{source:"iana",extensions:["spot"]},"text/vnd.iptc.newsml":{source:"iana"},"text/vnd.iptc.nitf":{source:"iana"},"text/vnd.latex-z":{source:"iana"},"text/vnd.motorola.reflex":{source:"iana"},"text/vnd.ms-mediapackage":{source:"iana"},"text/vnd.net2phone.commcenter.command":{source:"iana"},"text/vnd.radisys.msml-basic-layout":{source:"iana"},"text/vnd.senx.warpscript":{source:"iana"},"text/vnd.si.uricatalogue":{source:"apache"},"text/vnd.sosi":{source:"iana"},"text/vnd.sun.j2me.app-descriptor":{source:"iana",charset:"UTF-8",extensions:["jad"]},"text/vnd.trolltech.linguist":{source:"iana",charset:"UTF-8"},"text/vnd.vcf":{source:"iana"},"text/vnd.wap.si":{source:"iana"},"text/vnd.wap.sl":{source:"iana"},"text/vnd.wap.wml":{source:"iana",extensions:["wml"]},"text/vnd.wap.wmlscript":{source:"iana",extensions:["wmls"]},"text/vnd.zoo.kcl":{source:"iana"},"text/vtt":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["vtt"]},"text/wgsl":{source:"iana",extensions:["wgsl"]},"text/x-asm":{source:"apache",extensions:["s","asm"]},"text/x-c":{source:"apache",extensions:["c","cc","cxx","cpp","h","hh","dic"]},"text/x-component":{source:"nginx",extensions:["htc"]},"text/x-fortran":{source:"apache",extensions:["f","for","f77","f90"]},"text/x-gwt-rpc":{compressible:!0},"text/x-handlebars-template":{extensions:["hbs"]},"text/x-java-source":{source:"apache",extensions:["java"]},"text/x-jquery-tmpl":{compressible:!0},"text/x-lua":{extensions:["lua"]},"text/x-markdown":{compressible:!0,extensions:["mkd"]},"text/x-nfo":{source:"apache",extensions:["nfo"]},"text/x-opml":{source:"apache",extensions:["opml"]},"text/x-org":{compressible:!0,extensions:["org"]},"text/x-pascal":{source:"apache",extensions:["p","pas"]},"text/x-processing":{compressible:!0,extensions:["pde"]},"text/x-sass":{extensions:["sass"]},"text/x-scss":{extensions:["scss"]},"text/x-setext":{source:"apache",extensions:["etx"]},"text/x-sfv":{source:"apache",extensions:["sfv"]},"text/x-suse-ymp":{compressible:!0,extensions:["ymp"]},"text/x-uuencode":{source:"apache",extensions:["uu"]},"text/x-vcalendar":{source:"apache",extensions:["vcs"]},"text/x-vcard":{source:"apache",extensions:["vcf"]},"text/xml":{source:"iana",compressible:!0,extensions:["xml"]},"text/xml-external-parsed-entity":{source:"iana"},"text/yaml":{compressible:!0,extensions:["yaml","yml"]},"video/1d-interleaved-parityfec":{source:"iana"},"video/3gpp":{source:"iana",extensions:["3gp","3gpp"]},"video/3gpp-tt":{source:"iana"},"video/3gpp2":{source:"iana",extensions:["3g2"]},"video/av1":{source:"iana"},"video/bmpeg":{source:"iana"},"video/bt656":{source:"iana"},"video/celb":{source:"iana"},"video/dv":{source:"iana"},"video/encaprtp":{source:"iana"},"video/evc":{source:"iana"},"video/ffv1":{source:"iana"},"video/flexfec":{source:"iana"},"video/h261":{source:"iana",extensions:["h261"]},"video/h263":{source:"iana",extensions:["h263"]},"video/h263-1998":{source:"iana"},"video/h263-2000":{source:"iana"},"video/h264":{source:"iana",extensions:["h264"]},"video/h264-rcdo":{source:"iana"},"video/h264-svc":{source:"iana"},"video/h265":{source:"iana"},"video/h266":{source:"iana"},"video/iso.segment":{source:"iana",extensions:["m4s"]},"video/jpeg":{source:"iana",extensions:["jpgv"]},"video/jpeg2000":{source:"iana"},"video/jpm":{source:"apache",extensions:["jpm","jpgm"]},"video/jxsv":{source:"iana"},"video/lottie+json":{source:"iana",compressible:!0},"video/matroska":{source:"iana"},"video/matroska-3d":{source:"iana"},"video/mj2":{source:"iana",extensions:["mj2","mjp2"]},"video/mp1s":{source:"iana"},"video/mp2p":{source:"iana"},"video/mp2t":{source:"iana",extensions:["ts","m2t","m2ts","mts"]},"video/mp4":{source:"iana",compressible:!1,extensions:["mp4","mp4v","mpg4"]},"video/mp4v-es":{source:"iana"},"video/mpeg":{source:"iana",compressible:!1,extensions:["mpeg","mpg","mpe","m1v","m2v"]},"video/mpeg4-generic":{source:"iana"},"video/mpv":{source:"iana"},"video/nv":{source:"iana"},"video/ogg":{source:"iana",compressible:!1,extensions:["ogv"]},"video/parityfec":{source:"iana"},"video/pointer":{source:"iana"},"video/quicktime":{source:"iana",compressible:!1,extensions:["qt","mov"]},"video/raptorfec":{source:"iana"},"video/raw":{source:"iana"},"video/rtp-enc-aescm128":{source:"iana"},"video/rtploopback":{source:"iana"},"video/rtx":{source:"iana"},"video/scip":{source:"iana"},"video/smpte291":{source:"iana"},"video/smpte292m":{source:"iana"},"video/ulpfec":{source:"iana"},"video/vc1":{source:"iana"},"video/vc2":{source:"iana"},"video/vnd.cctv":{source:"iana"},"video/vnd.dece.hd":{source:"iana",extensions:["uvh","uvvh"]},"video/vnd.dece.mobile":{source:"iana",extensions:["uvm","uvvm"]},"video/vnd.dece.mp4":{source:"iana"},"video/vnd.dece.pd":{source:"iana",extensions:["uvp","uvvp"]},"video/vnd.dece.sd":{source:"iana",extensions:["uvs","uvvs"]},"video/vnd.dece.video":{source:"iana",extensions:["uvv","uvvv"]},"video/vnd.directv.mpeg":{source:"iana"},"video/vnd.directv.mpeg-tts":{source:"iana"},"video/vnd.dlna.mpeg-tts":{source:"iana"},"video/vnd.dvb.file":{source:"iana",extensions:["dvb"]},"video/vnd.fvt":{source:"iana",extensions:["fvt"]},"video/vnd.hns.video":{source:"iana"},"video/vnd.iptvforum.1dparityfec-1010":{source:"iana"},"video/vnd.iptvforum.1dparityfec-2005":{source:"iana"},"video/vnd.iptvforum.2dparityfec-1010":{source:"iana"},"video/vnd.iptvforum.2dparityfec-2005":{source:"iana"},"video/vnd.iptvforum.ttsavc":{source:"iana"},"video/vnd.iptvforum.ttsmpeg2":{source:"iana"},"video/vnd.motorola.video":{source:"iana"},"video/vnd.motorola.videop":{source:"iana"},"video/vnd.mpegurl":{source:"iana",extensions:["mxu","m4u"]},"video/vnd.ms-playready.media.pyv":{source:"iana",extensions:["pyv"]},"video/vnd.nokia.interleaved-multimedia":{source:"iana"},"video/vnd.nokia.mp4vr":{source:"iana"},"video/vnd.nokia.videovoip":{source:"iana"},"video/vnd.objectvideo":{source:"iana"},"video/vnd.planar":{source:"iana"},"video/vnd.radgamettools.bink":{source:"iana"},"video/vnd.radgamettools.smacker":{source:"apache"},"video/vnd.sealed.mpeg1":{source:"iana"},"video/vnd.sealed.mpeg4":{source:"iana"},"video/vnd.sealed.swf":{source:"iana"},"video/vnd.sealedmedia.softseal.mov":{source:"iana"},"video/vnd.uvvu.mp4":{source:"iana",extensions:["uvu","uvvu"]},"video/vnd.vivo":{source:"iana",extensions:["viv"]},"video/vnd.youtube.yt":{source:"iana"},"video/vp8":{source:"iana"},"video/vp9":{source:"iana"},"video/webm":{source:"apache",compressible:!1,extensions:["webm"]},"video/x-f4v":{source:"apache",extensions:["f4v"]},"video/x-fli":{source:"apache",extensions:["fli"]},"video/x-flv":{source:"apache",compressible:!1,extensions:["flv"]},"video/x-m4v":{source:"apache",extensions:["m4v"]},"video/x-matroska":{source:"apache",compressible:!1,extensions:["mkv","mk3d","mks"]},"video/x-mng":{source:"apache",extensions:["mng"]},"video/x-ms-asf":{source:"apache",extensions:["asf","asx"]},"video/x-ms-vob":{source:"apache",extensions:["vob"]},"video/x-ms-wm":{source:"apache",extensions:["wm"]},"video/x-ms-wmv":{source:"apache",compressible:!1,extensions:["wmv"]},"video/x-ms-wmx":{source:"apache",extensions:["wmx"]},"video/x-ms-wvx":{source:"apache",extensions:["wvx"]},"video/x-msvideo":{source:"apache",extensions:["avi"]},"video/x-sgi-movie":{source:"apache",extensions:["movie"]},"video/x-smv":{source:"apache",extensions:["smv"]},"x-conference/x-cooltalk":{source:"apache",extensions:["ice"]},"x-shader/x-fragment":{compressible:!0},"x-shader/x-vertex":{compressible:!0}};function requireMimeDb(){return hasRequiredMimeDb?mimeDb:(hasRequiredMimeDb=1,mimeDb=require$$0$1)}function requireMimeScore(){if(hasRequiredMimeScore)return mimeScore;hasRequiredMimeScore=1;var e={"prs.":100,"x-":200,"x.":300,"vnd.":400,default:900},a={nginx:10,apache:20,iana:40,default:30},n={application:1,font:2,audio:2,video:3,default:0};return mimeScore=function(t,s="default"){if("application/octet-stream"===t)return 0;const[i,o]=t.split("/"),r=o.replace(/(\.|x-).*/,"$1");return(e[r]||e.default)+(a[s]||a.default)+(n[i]||n.default)+(1-t.length/100)}}function requireMimeTypes(){return hasRequiredMimeTypes||(hasRequiredMimeTypes=1,function(e){var a,n,t=requireMimeDb(),s=path.extname,i=requireMimeScore(),o=/^\s*([^;\s]*)(?:;|\s|$)/,r=/^text\//i;function c(e){if(!e||"string"!=typeof e)return!1;var a=o.exec(e),n=a&&t[a[1].toLowerCase()];return n&&n.charset?n.charset:!(!a||!r.test(a[1]))&&"UTF-8"}function p(a){if(!a||"string"!=typeof a)return!1;var n=o.exec(a),t=n&&e.extensions[n[1].toLowerCase()];return!(!t||!t.length)&&t[0]}function l(e,a,n){return(a?i(a,t[a].source):0)>(n?i(n,t[n].source):0)?a:n}function d(a,n,s){var i=["nginx","apache",void 0,"iana"],o=n?i.indexOf(t[n].source):0,r=s?i.indexOf(t[s].source):0;return"application/octet-stream"!==e.types[p]&&(o>r||o===r&&"application/"===e.types[p]?.slice(0,12))||o>r?n:s}e.charset=c,e.charsets={lookup:c},e.contentType=function(a){if(!a||"string"!=typeof a)return!1;var n=-1===a.indexOf("/")?e.lookup(a):a;if(!n)return!1;if(-1===n.indexOf("charset")){var t=e.charset(n);t&&(n+="; charset="+t.toLowerCase())}return n},e.extension=p,e.extensions=Object.create(null),e.lookup=function(a){if(!a||"string"!=typeof a)return!1;var n=s("x."+a).toLowerCase().slice(1);return n&&e.types[n]||!1},e.types=Object.create(null),e._extensionConflicts=[],a=e.extensions,n=e.types,Object.keys(t).forEach(function(s){var i=t[s].extensions;if(i&&i.length){a[s]=i;for(var o=0;o<i.length;o++){var r=i[o];n[r]=l(0,n[r],s);const a=d(0,n[r],s);a!==n[r]&&e._extensionConflicts.push([r,a,n[r]])}}})}(mimeTypes)),mimeTypes}var mimeTypesExports=requireMimeTypes();async function decryptDataEncryptionKey(e){try{const a=await _package.machine.getSecretKey();if(!a)return _package.logger.warn("[WORKSPACE] Machine secret key not available"),null;const n=shared.decodeBase64(e);return shared.decryptWithEphemeralKey(n,a)||(_package.logger.warn("[WORKSPACE] Failed to decrypt dataEncryptionKey"),null)}catch(e){return _package.logger.warn("[WORKSPACE] Error decrypting dataEncryptionKey:",e),null}}function resolveFilePath$1(e,a,n){return _package.machine.resolveWorkspaceFilePath(e,a,n)}function sendResponse(e,a){e?e.send("workspace-file-response",a):_package.logger.error("[WORKSPACE] Cannot send workspace-file-response: client not available")}function createErrorResponse(e,a,n,t){return{eventId:shared.createEventId(),requestId:e,taskId:a,success:!1,error:{code:n,message:t}}}function handleNotModified(e,a,n,t){_package.logger.debug(`[WORKSPACE] File not modified: ${t}`),sendResponse(e,{eventId:shared.createEventId(),requestId:a,taskId:n,success:!0,notModified:!0})}async function handleDirectory(e,a,n,t,s,i){const o=await fs__namespace.promises.readdir(t,{withFileTypes:!0}),r=await Promise.all(o.map(async e=>{const a=path__namespace.join(t,e.name),n=await fs__namespace.promises.stat(a);return{name:e.name,type:e.isDirectory()?"directory":"file",size:n.size,modifiedAt:n.mtime.toISOString(),accessDenied:n.size>i}}));sendResponse(e,{eventId:shared.createEventId(),requestId:a,taskId:n,success:!0,data:{type:"directory",entries:r,metadata:{size:0,modifiedAt:s.mtime.toISOString()}}})}function handleFileTooLarge(e,a,n,t,s,i,o){_package.logger.warn(`[WORKSPACE] File too large (${s.size} bytes > ${o} bytes): ${t}`),sendResponse(e,{eventId:shared.createEventId(),requestId:a,taskId:n,success:!0,data:{type:"file",metadata:{size:s.size,mimeType:i,modifiedAt:s.mtime.toISOString(),accessDenied:!0}}})}async function handleFile(e,a,n,t,s,i){const o=mimeTypesExports.lookup(t)||"application/octet-stream",r=(await fs__namespace.promises.readFile(t)).toString("base64");let c=null;i&&(c=await decryptDataEncryptionKey(i));const p={type:"file",metadata:{size:s.size,mimeType:o,modifiedAt:s.mtime.toISOString()}};c?p.encryptedContent=shared.encryptFileContent(r,c):p.content=r,sendResponse(e,{eventId:shared.createEventId(),requestId:a,taskId:n,success:!0,data:p})}function workspaceFileRequestHandler(e){return async a=>{const{taskId:n,userId:t,relativePath:s,requestId:i,maxFileSizeMB:o,ifModifiedSince:r,dataEncryptionKey:c}=a;_package.logger.debug(`[WORKSPACE] File request: taskId=${n}, userId=${t}, relativePath=${s}, maxFileSizeMB=${o}, ifModifiedSince=${r}, hasEncryptionKey=${!!c}`);try{const a=1024*(o||10)*1024,p=resolveFilePath$1(t,n,s);if(!fs__namespace.existsSync(p))return _package.logger.warn(`[WORKSPACE] File not found: ${p}`),void sendResponse(e.client,createErrorResponse(i,n,"file_not_found","File or directory not found"));const l=await fs__namespace.promises.stat(p),d=l.mtime.toISOString();if(r&&d===r)return void handleNotModified(e.client,i,n,p);if(l.isDirectory())return void await handleDirectory(e.client,i,n,p,l,a);{const t=mimeTypesExports.lookup(p)||"application/octet-stream";return l.size>a?void handleFileTooLarge(e.client,i,n,p,l,t,a):void await handleFile(e.client,i,n,p,l,c)}}catch(a){_package.logger.error(`[WORKSPACE] Failed to handle workspace-file-request: ${a.message}`,a);const t="ENOENT"===a.code?"file_not_found":"EACCES"===a.code?"permission_denied":"unknown_error";sendResponse(e.client,createErrorResponse(i,n,t,a.message))}}}const CREDENTIALS_DIR=path$1.join(_package.machine.agentrixHomeDir,"credentials"),ALGORITHM="aes-256-gcm";function getPatFilePath(e){return path$1.join(CREDENTIALS_DIR,`${e}.pat.enc`)}function getPatMetaFilePath(e){return path$1.join(CREDENTIALS_DIR,`${e}.pat.meta.json`)}function loadPatMeta(e){const a=getPatMetaFilePath(e);if(!fs$1.existsSync(a))return null;try{return JSON.parse(fs$1.readFileSync(a,"utf8"))}catch{return null}}function loadPat(e,a){const n=getPatFilePath(e);if(!fs$1.existsSync(n))return null;try{const e=fs$1.readFileSync(n,"utf8"),{iv:t,authTag:s,encrypted:i}=JSON.parse(e),o=a.slice(0,32),r=node_crypto.createDecipheriv(ALGORITHM,o,Buffer.from(t,"hex"));r.setAuthTag(Buffer.from(s,"hex"));let c=r.update(i,"hex","utf8");return c+=r.final("utf8"),c}catch{return null}}const PROXY_ALLOWLIST=[{method:"GET",pattern:/^\/projects$/},{method:"GET",pattern:/^\/projects\/[^/]+\/repository\/branches$/},{method:"GET",pattern:/^\/projects\/[^/]+\/issues$/},{method:"GET",pattern:/^\/projects\/[^/]+\/issues\/\d+$/},{method:"GET",pattern:/^\/projects\/[^/]+\/merge_requests$/},{method:"GET",pattern:/^\/projects\/[^/]+\/merge_requests\/\d+$/},{method:"POST",pattern:/^\/projects\/[^/]+\/merge_requests$/}];class GitLabExecutor{apiUrl;pat;requestId;gitServerId;constructor(e,a,n){this.apiUrl=e,this.pat=a,this.requestId=n?.requestId,this.gitServerId=n?.gitServerId}logPrefix(){return`[GITLAB EXECUTOR] reqId=${this.requestId??"-"}, gitServer=${this.gitServerId??"-"}`}summarizeResult(e,a){if(Array.isArray(a))return`items=${a.length}`;if(a&&"object"==typeof a){const n=a;return"resolveGitAuthContext"===e?`authMode=${String(n.authMode??"unknown")}, hasPat=${Boolean(n.hasPat)}`:"number"in n||"state"in n?`number=${String(n.number??"-")}, state=${String(n.state??"-")}`:`keys=${Object.keys(n).join(",")||"-"}`}return"type="+typeof a}truncateText(e,a=300){return e.length<=a?e:`${e.slice(0,a)}...`}async request(e,a="GET",n){const t=`${this.apiUrl}${e}`,s={Authorization:`Bearer ${this.pat}`,"Content-Type":"application/json"},i=Date.now();_package.logger.debug(`${this.logPrefix()} request start: ${a} ${e}`);try{const o=await fetch(t,{method:a,headers:s,body:n?JSON.stringify(n):void 0}),r=Date.now()-i;if(!o.ok){const n=await o.text().catch(()=>"Unknown error"),t=this.truncateText(n);throw _package.logger.warn(`${this.logPrefix()} request failed: ${a} ${e}, status=${o.status}, elapsedMs=${r}, detail=${t}`),{status:o.status,message:`GitLab API error: ${o.status} ${o.statusText}`,detail:t}}return _package.logger.debug(`${this.logPrefix()} request success: ${a} ${e}, elapsedMs=${r}`),await o.json()}catch(n){if("object"==typeof n&&null!==n&&"status"in n)throw n;const t=n instanceof Error?n.message:"Unknown network error";throw _package.logger.error(`${this.logPrefix()} request exception: ${a} ${e}, message=${t}`),{status:0,message:`GitLab request failed: ${t}`}}}async executeOperation(e,a){_package.logger.info(`${this.logPrefix()} execute operation: op=${e}, payloadKeys=${Object.keys(a||{}).join(",")||"-"}`);try{let n;switch(e){case"listRepos":n=await this.listRepos();break;case"listBranches":n=await this.listBranches(a.owner,a.name);break;case"createMergeRequest":n=await this.createMergeRequest(a);break;case"getMergeRequest":n=await this.getMergeRequest(a.owner,a.name,a.iid);break;case"listMergeRequests":n=await this.listMergeRequests(a.owner,a.name);break;case"requestGitlabApi":n=await this.requestGitlabApi(a);break;case"resolveGitAuthContext":n={authMode:"local_pat",hasPat:!0};break;default:throw{status:400,message:`Unknown operation: ${e}`}}return _package.logger.info(`${this.logPrefix()} operation success: op=${e}, summary=${this.summarizeResult(e,n)}`),n}catch(a){const n=a instanceof Error?a.message:"object"==typeof a&&null!==a&&"message"in a?String(a.message):"Unknown error";throw _package.logger.error(`${this.logPrefix()} operation failed: op=${e}, message=${n}`),a}}async listRepos(){return(await this.request("/projects?membership=true&per_page=100&order_by=updated_at&sort=desc")).map(e=>({id:e.id,owner:e.namespace.path,name:e.path,fullName:e.path_with_namespace,defaultBranch:e.default_branch,isPrivate:"private"===e.visibility,description:e.description,url:e.web_url,createdAt:e.created_at,updatedAt:e.updated_at}))}async listBranches(e,a){const n=encodeURIComponent(`${e}/${a}`);return(await this.request(`/projects/${n}/repository/branches?per_page=100`)).map(e=>({name:e.name,commit:{sha:e.commit.id,url:""},protected:e.protected}))}async createMergeRequest(e){const a=encodeURIComponent(`${e.owner}/${e.repo}`),n=await this.request(`/projects/${a}/merge_requests`,"POST",{source_branch:e.head,target_branch:e.base,title:e.title,description:e.body||""});return{number:n.iid,title:n.title,body:n.description,state:"opened"===n.state?"open":n.state,url:n.web_url,head:n.source_branch,base:n.target_branch,createdAt:n.created_at,updatedAt:n.updated_at}}async getMergeRequest(e,a,n){const t=encodeURIComponent(`${e}/${a}`),s=await this.request(`/projects/${t}/merge_requests/${n}`);return{number:s.iid,title:s.title,body:s.description,state:"opened"===s.state?"open":s.state,url:s.web_url,head:s.source_branch,base:s.target_branch,createdAt:s.created_at,updatedAt:s.updated_at}}async listMergeRequests(e,a){const n=encodeURIComponent(`${e}/${a}`);return(await this.request(`/projects/${n}/merge_requests?state=opened&per_page=20`)).map(e=>({number:e.iid,title:e.title,body:e.description,state:"opened"===e.state?"open":e.state,url:e.web_url,head:e.source_branch,base:e.target_branch,createdAt:e.created_at,updatedAt:e.updated_at}))}parseProxyMethod(e){const a="string"==typeof e?e.toUpperCase():"GET";if("GET"===a||"POST"===a||"PUT"===a||"PATCH"===a||"DELETE"===a)return a;throw{status:400,message:`Unsupported proxy method: ${String(e)}`}}parseProxyPath(e){if("string"!=typeof e||0===e.length)throw{status:400,message:"Proxy path is required"};if(!e.startsWith("/"))throw{status:400,message:'Proxy path must start with "/"'};if(e.includes("://")||e.includes(".."))throw{status:400,message:"Proxy path contains invalid segments"};if(e.includes("?"))throw{status:400,message:"Proxy path must not contain query string; use payload.query"};return e}buildProxyQueryString(e){if(null==e)return"";if("object"!=typeof e||Array.isArray(e))throw{status:400,message:"Proxy query must be an object"};const a=new URLSearchParams;for(const[n,t]of Object.entries(e))if(null!=t)if(Array.isArray(t))for(const e of t){if("string"!=typeof e&&"number"!=typeof e&&"boolean"!=typeof e)throw{status:400,message:`Proxy query value for "${n}" is invalid`};a.append(n,String(e))}else{if("string"!=typeof t&&"number"!=typeof t&&"boolean"!=typeof t)throw{status:400,message:`Proxy query value for "${n}" is invalid`};a.append(n,String(t))}return a.toString()}isProxyAllowed(e,a){return PROXY_ALLOWLIST.some(n=>n.method===e&&n.pattern.test(a))}async requestGitlabApi(e){const a=this.parseProxyMethod(e.method),n=this.parseProxyPath(e.path),t=this.buildProxyQueryString(e.query),s=t.length>0?`${n}?${t}`:n;if(!this.isProxyAllowed(a,n))throw{status:403,message:`Proxy path not allowed: ${a} ${n}`};return"GET"===a?await this.request(s,a):await this.request(s,a,e.body)}}function summarizePayloadKeys(e){const a=Object.keys(e||{});return a.length>0?a.join(","):"-"}function truncateValue(e,a=300){return e.length<=a?e:`${e.slice(0,a)}...`}function summarizeGitlabResult(e,a){if(Array.isArray(a))return`items=${a.length}`;if(a&&"object"==typeof a){const n=a;return"resolveGitAuthContext"===e?`authMode=${String(n.authMode??"unknown")}, hasPat=${Boolean(n.hasPat)}`:"number"in n||"state"in n?`number=${String(n.number??"-")}, state=${String(n.state??"-")}`:`keys=${Object.keys(n).join(",")||"-"}`}return"type="+typeof a}function resolveApiHost(e){try{return new URL(e).host}catch{return"invalid-url"}}function createTaskHandler(e){return async(a,n)=>{_package.logger.info(`[EVENT HANDLER] create-task: ${a.taskId}, agentType=${a.agentType}, agentId=${a.agentId}`),"task-message"===a.event?await e.workerManager.startWorker(a,"create-task"):_package.logger.error(`[EVENT HANDLER] create-task expects task-message, got ${a.event} for task ${a.taskId}`)}}function resumeTaskHandler(e){return async(a,n)=>{_package.logger.debug(`[EVENT HANDLER] resume-task: ${a.taskId}, agentSessionId=${a.agentSessionId}`),await e.workerManager.startWorker(a,"resume-task")}}function shutdownMachineHandler(e){return async a=>{_package.logger.info("[EVENT HANDLER] shutdown-machine received",a),e.requestShutdown("agentrix-app",a.reason)}}function deployAgentHandler(e){return async(a,n)=>{_package.logger.info(`[EVENT HANDLER] deploy-agent received: taskId=${a.taskId}, draftAgentId=${a.draftAgentId}, targetAgentId=${a.targetAgentId}, sourcePath=${a.sourcePath}`),await e.workerManager.startDeploymentWorker(a)}}function daemonGitlabRequestHandler(e){return async a=>{_package.logger.info(`[GITLAB PROXY] request received: reqId=${a.requestId}, op=${a.operation}, gitServer=${a.gitServerId}, ttlMs=${a.ttlMs}, payloadKeys=${summarizePayloadKeys(a.payload)}`);const n=Date.now(),t=n=>{const t={eventId:a.requestId,requestId:a.requestId,machineId:e.machineId,...n};e.client?(e.client.send("daemon-gitlab-response",t),_package.logger.info(`[GITLAB PROXY] response sent: reqId=${a.requestId}, op=${a.operation}, success=${n.success}, executionMs=${n.executionTimeMs}`)):_package.logger.error(`[GITLAB PROXY] response dropped: reqId=${a.requestId}, op=${a.operation}, reason=socket-client-unavailable`)};try{const e=await _package.machine.getSecretKey();if(!e)return _package.logger.warn(`[GITLAB PROXY] machine secret key unavailable: reqId=${a.requestId}, op=${a.operation}, gitServer=${a.gitServerId}`),void t({success:!1,errorCode:"PAT_MISSING",errorMessage:"Machine secret key not available",executionTimeMs:Date.now()-n});const s=loadPat(a.gitServerId,e);if(!s)return _package.logger.warn(`[GITLAB PROXY] PAT missing: reqId=${a.requestId}, op=${a.operation}, gitServer=${a.gitServerId}`),void t({success:!1,errorCode:"PAT_MISSING",errorMessage:`No PAT configured for git server ${a.gitServerId}`,executionTimeMs:Date.now()-n});const i=a.payload.apiUrl;if(!i)return _package.logger.warn(`[GITLAB PROXY] apiUrl missing in payload: reqId=${a.requestId}, op=${a.operation}, gitServer=${a.gitServerId}`),void t({success:!1,errorCode:"PAT_MISSING",errorMessage:"GitLab API URL not provided in request",executionTimeMs:Date.now()-n});_package.logger.info(`[GITLAB PROXY] executing: reqId=${a.requestId}, op=${a.operation}, gitServer=${a.gitServerId}, apiHost=${resolveApiHost(i)}`);const o=new GitLabExecutor(i,s,{requestId:a.requestId,gitServerId:a.gitServerId}),r=await o.executeOperation(a.operation,a.payload);_package.logger.info(`[GITLAB PROXY] execution succeeded: reqId=${a.requestId}, op=${a.operation}, summary=${summarizeGitlabResult(a.operation,r)}`),t({success:!0,data:r,executionTimeMs:Date.now()-n})}catch(e){const s=e;let i="GITLAB_CONNECTIVITY_FAILED";401===s.status?i="PAT_INVALID":403===s.status?i="PAT_SCOPE_INSUFFICIENT":404===s.status&&(i="RESOURCE_NOT_FOUND");const o="string"==typeof s.message?s.message:"Unknown error",r="string"==typeof s.detail?truncateValue(s.detail):void 0,c="number"==typeof s.status?String(s.status):"unknown";_package.logger.error(`[GITLAB PROXY] execution failed: reqId=${a.requestId}, op=${a.operation}, errorCode=${i}, status=${c}, message=${o}${r?`, detail=${r}`:""}`),t({success:!1,errorCode:i,errorMessage:o,executionTimeMs:Date.now()-n})}}}function createEventHandlers(e){return{"create-task":createTaskHandler(e),"resume-task":resumeTaskHandler(e),"deploy-agent":deployAgentHandler(e),"shutdown-machine":shutdownMachineHandler(e),"workspace-file-request":workspaceFileRequestHandler({client:e.client}),"daemon-gitlab-request":daemonGitlabRequestHandler(e)}}const CHUNK_SIZE=65536,DEFAULT_MAX_FILE_SIZE_MB=parseInt(process.env.MAX_WORKSPACE_FILE_SIZE_MB||"100",10);function getPeerConnectionConstructor(e){return e.RTCPeerConnection||e.PeerConnection||e.RTCConnection||e.PeerConnection}function normalizeIceServers(e){const a=[];return e.forEach(e=>{Array.isArray(e.urls)?a.push(...e.urls):a.push(e.urls)}),a}function sendChannelMessage(e,a){if(!e)return;if("string"==typeof a)return void(e.sendMessage?e.sendMessage(a):e.send&&e.send(a));const n=Buffer.from(a);e.sendMessageBinary?e.sendMessageBinary(n):e.send&&e.send(n)}function normalizeSignalDescription(e,a){return e&&"object"==typeof e&&"string"==typeof e.sdp?{sdp:e.sdp,type:e.type||a}:{sdp:String(e||""),type:a}}function normalizeCandidate(e,a,n){return"string"==typeof e?{candidate:e,sdpMid:a||"0",sdpMLineIndex:n??0}:e&&"string"==typeof e.candidate?{candidate:e.candidate,sdpMid:e.sdpMid||e.mid||a||"0",sdpMLineIndex:"number"==typeof e.sdpMLineIndex?e.sdpMLineIndex:n??0}:null}function resolveFilePath(e,a,n){return _package.machine.resolveWorkspaceFilePath(e,a,n)}function isFileModified(e,a){return!a||e.mtime.toISOString()!==a}class MachineRtcManager{client;machineId;iceServers=[];sessions=new Map;rtcModule;peerConstructor;constructor(e,a){this.client=e,this.machineId=a;const n=node_module.createRequire("undefined"==typeof document?require("url").pathToFileURL(__filename).href:_documentCurrentScript&&"SCRIPT"===_documentCurrentScript.tagName.toUpperCase()&&_documentCurrentScript.src||new URL("index.cjs",document.baseURI).href);this.rtcModule=n("node-datachannel"),this.peerConstructor=getPeerConnectionConstructor(this.rtcModule),this.rtcModule.setDebugLevel?.("warning")}registerHandlers(){this.peerConstructor?(this.client.onLifecycle("connect",()=>{this.requestIceServers()}),this.client.onEvent("rtc-ice-servers-response",e=>this.handleIceServersResponse(e)),this.client.onEvent("machine-rtc-request",e=>this.handleRtcRequest(e)),this.client.onEvent("rtc-signal",e=>this.handleRtcSignal(e))):_package.logger.warn("[RTC] node-datachannel RTCPeerConnection not available")}shutdown(){this.sessions.forEach(e=>{e.peerConnection.close?.()}),this.sessions.clear()}requestIceServers(){this.client.send("rtc-ice-servers-request",{eventId:shared.createEventId()})}handleIceServersResponse(e){this.iceServers=normalizeIceServers(e.iceServers),_package.logger.info(`[RTC] Loaded ${this.iceServers.length} ICE servers`)}handleRtcRequest(e){if(!this.peerConstructor)return;const a=e.userId;if(!a)return void _package.logger.warn("[RTC] machine-rtc-request missing userId");const n=e.workspaceUserId||a,t=e.taskId;if(this.sessions.has(e.sessionId))return void this.sendMachineRtcResponse(e.sessionId,a,!0);const s=new this.peerConstructor(e.sessionId,{iceServers:this.iceServers}),i={sessionId:e.sessionId,userId:a,workspaceUserId:n,allowedTaskId:t||void 0,peerConnection:s,lastActivity:Date.now(),remoteDescriptionSet:!1,pendingCandidates:[]};this.sessions.set(e.sessionId,i),this.registerPeerHandlers(i),this.sendMachineRtcResponse(e.sessionId,a,!0)}sendMachineRtcResponse(e,a,n,t){this.client.send("machine-rtc-response",{eventId:shared.createEventId(),machineId:this.machineId,sessionId:e,accepted:n,reason:t,userId:a,capabilities:{dataChannel:!0}})}handleRtcSignal(e){if(!this.peerConstructor)return;if("app"!==e.from)return;const a=e.userId;if(!a)return void _package.logger.warn("[RTC] rtc-signal missing userId");const n=e.workspaceUserId||a,t=e.taskId;let s=this.sessions.get(e.sessionId);if(!s){const i=new this.peerConstructor(e.sessionId,{iceServers:this.iceServers});s={sessionId:e.sessionId,userId:a,workspaceUserId:n,allowedTaskId:t||void 0,peerConnection:i,lastActivity:Date.now(),remoteDescriptionSet:!1,pendingCandidates:[]},this.sessions.set(e.sessionId,s),this.registerPeerHandlers(s)}try{this.applyRemoteSignal(s,e.signal)}catch(e){_package.logger.warn("[RTC] Failed to apply remote signal",e)}}registerPeerHandlers(e){const{peerConnection:a}=e;a.onStateChange?.(a=>{_package.logger.info(`[RTC] Peer state (${e.sessionId}): ${a}`)}),a.onGatheringStateChange?.(a=>{_package.logger.info(`[RTC] ICE gathering (${e.sessionId}): ${a}`)}),a.onLocalDescription?.((a,n)=>{const t=normalizeSignalDescription(a,n);this.client.send("rtc-signal",{eventId:shared.createEventId(),machineId:this.machineId,sessionId:e.sessionId,from:"machine",signal:t,userId:e.userId})}),a.onLocalCandidate?.((a,n,t)=>{const s=normalizeCandidate(a,n,t);s&&this.client.send("rtc-signal",{eventId:shared.createEventId(),machineId:this.machineId,sessionId:e.sessionId,from:"machine",signal:{candidate:s},userId:e.userId})}),a.onDataChannel?.(a=>{e.dataChannel=a,this.registerDataChannel(e,a)})}registerDataChannel(e,a){a.onOpen?.(()=>{_package.logger.info(`[RTC] Data channel open (${e.sessionId})`),e.lastActivity=Date.now(),sendChannelMessage(a,JSON.stringify({v:1,type:"control.ready",channel:"control",requestId:`req-${e.sessionId}`,streamId:0,timestamp:(new Date).toISOString(),payload:{ok:!0}}))}),a.onClosed?.(()=>{_package.logger.warn(`[RTC] Data channel closed (${e.sessionId})`),e.peerConnection.close?.(),this.sessions.delete(e.sessionId)}),a.onError?.(a=>{_package.logger.error(`[RTC] Data channel error (${e.sessionId})`,a)}),a.onMessage?.(a=>{e.lastActivity=Date.now(),this.handleDataChannelMessage(e,a)})}handleDataChannelMessage(e,a){if(Buffer.isBuffer(a)||a instanceof Uint8Array){try{shared.splitRtcChunkFrame(new Uint8Array(a))}catch(e){_package.logger.warn("[RTC] Received binary payload without handler")}return}let n=null;if("string"==typeof a?n=a:a&&"string"==typeof a.text&&(n=a.text),!n)return;let t=null;try{t=JSON.parse(n)}catch(e){return void _package.logger.warn("[RTC] Non-JSON message",n)}t&&"string"==typeof t.type&&"file.request"===t.type&&this.handleFileRequest(e,t).catch(e=>{_package.logger.error("[RTC] Failed to handle file request",e)})}async handleFileRequest(e,a){const n=a.payload;if(!n)return;if(n.userId!==e.workspaceUserId)return void this.sendControl(e,{v:1,type:"file.error",channel:"file",requestId:a.requestId,streamId:a.streamId,timestamp:(new Date).toISOString(),error:{code:"unauthorized",message:"Unauthorized workspace access"}});if(e.allowedTaskId&&n.taskId!==e.allowedTaskId)return void this.sendControl(e,{v:1,type:"file.error",channel:"file",requestId:a.requestId,streamId:a.streamId,timestamp:(new Date).toISOString(),error:{code:"unauthorized",message:"Unauthorized task access"}});const t=resolveFilePath(n.userId,n.taskId,n.relativePath);if(!fs__namespace.existsSync(t))return void this.sendControl(e,{v:1,type:"file.error",channel:"file",requestId:a.requestId,streamId:a.streamId,timestamp:(new Date).toISOString(),error:{code:"file_not_found",message:"File or directory not found"}});const s=await fs__namespace.promises.stat(t);if(!isFileModified(s,n.ifModifiedSince))return void this.sendControl(e,{v:1,type:"file.not_modified",channel:"file",requestId:a.requestId,streamId:a.streamId,timestamp:(new Date).toISOString()});if(s.isDirectory()||"directory"===n.entryType){const n=await fs__namespace.promises.readdir(t,{withFileTypes:!0}),i={entries:await Promise.all(n.map(async e=>{const a=path__namespace.join(t,e.name),n=await fs__namespace.promises.stat(a);return{name:e.name,type:e.isDirectory()?"directory":"file",size:n.size,modifiedAt:n.mtime.toISOString()}})),modifiedAt:s.mtime.toISOString()};return void this.sendControl(e,{v:1,type:"file.dir",channel:"file",requestId:a.requestId,streamId:a.streamId,timestamp:(new Date).toISOString(),payload:i})}const i=1024*(n.maxFileSizeMB??DEFAULT_MAX_FILE_SIZE_MB)*1024;if(s.size>i)return void this.sendControl(e,{v:1,type:"file.error",channel:"file",requestId:a.requestId,streamId:a.streamId,timestamp:(new Date).toISOString(),error:{code:"file_too_large",message:"File exceeds size limit"}});const o=mimeTypesExports.lookup(t)||"application/octet-stream",r={size:s.size,mimeType:"string"==typeof o?o:"application/octet-stream",modifiedAt:s.mtime.toISOString()};this.sendControl(e,{v:1,type:"file.meta",channel:"file",requestId:a.requestId,streamId:a.streamId,timestamp:(new Date).toISOString(),payload:r}),await this.sendFileChunks(e,a.streamId,t),this.sendControl(e,{v:1,type:"file.end",channel:"file",requestId:a.requestId,streamId:a.streamId,timestamp:(new Date).toISOString(),payload:{size:s.size}})}async sendFileChunks(e,a,n){const t=e.dataChannel;if(!t)return;const s=fs__namespace.createReadStream(n,{highWaterMark:65536});let i=0;await new Promise((e,n)=>{s.on("data",e=>{const n=shared.RtcChunkFlags.Binary|(0===i?shared.RtcChunkFlags.Start:0),s=Buffer.isBuffer(e)?e:Buffer.from(e),o=new Uint8Array(s.buffer,s.byteOffset,s.byteLength),r=shared.buildRtcChunkFrame({streamId:a,seq:i,flags:n,payloadLength:o.length},o);sendChannelMessage(t,r),i+=1}),s.on("end",()=>{if(i>0){const e=shared.buildRtcChunkFrame({streamId:a,seq:i,flags:shared.RtcChunkFlags.End|shared.RtcChunkFlags.Binary,payloadLength:0},new Uint8Array);sendChannelMessage(t,e)}e()}),s.on("error",e=>n(e))})}sendControl(e,a){const n=e.dataChannel;n&&sendChannelMessage(n,JSON.stringify(a))}applyRemoteSignal(e,a){const{peerConnection:n}=e;if(a&&a.sdp&&a.type)return n.setRemoteDescription?.(a.sdp,a.type),e.remoteDescriptionSet=!0,e.pendingCandidates?.forEach(e=>{try{n.addRemoteCandidate?.(e.candidate,e.mid)}catch(e){_package.logger.warn("[RTC] Failed to add queued candidate",e)}}),void(e.pendingCandidates=[]);if(a&&a.candidate){const t=a.candidate,s="string"==typeof t?t:t&&"string"==typeof t.candidate?t.candidate:null,i=a.sdpMid||t?.sdpMid||t?.mid||"0";if(s){if(!e.remoteDescriptionSet)return void e.pendingCandidates?.push({candidate:s,mid:i});n.addRemoteCandidate?.(s,i)}}}}class MachineClient{client;context;rtcManager;constructor(e,a,n){const{machineId:t,...s}=e;this.client=new SocketClient(s),this.context={machineId:t,workerManager:a,requestShutdown:n.requestShutdown,client:this.client},this.rtcManager=new MachineRtcManager(this.client,t),this.initHandlers(),this.rtcManager.registerHandlers()}connect(){return new Promise((e,a)=>{const n=setTimeout(()=>{a(new Error("Machine connection timeout after 30 seconds"))},3e4);this.client.onLifecycle("connect",()=>{clearTimeout(n),e()}),this.client.onLifecycle("connect_error",e=>{clearTimeout(n),a(e)}),this.client.connect()})}async disconnect(){this.client.connected&&await this.client.flush(5e3).catch(()=>{}),this.rtcManager.shutdown(),this.client.disconnect()}initHandlers(){const e=createEventHandlers(this.context);this.client.onEventWithAck("create-task",e["create-task"]),this.client.onEventWithAck("resume-task",e["resume-task"]),this.client.onEventWithAck("deploy-agent",e["deploy-agent"]),this.client.onEvent("shutdown-machine",e["shutdown-machine"]),this.client.onEvent("workspace-file-request",e["workspace-file-request"]),this.client.onEvent("daemon-gitlab-request",e["daemon-gitlab-request"])}}let caffeinateProcess=null;function startCaffeinate(){if(_package.machine.disableCaffeinate)return _package.logger.debug("[caffeinate] Caffeinate disabled via AGENTRIX_DISABLE_CAFFEINATE environment variable"),!1;if("darwin"!==process.platform)return _package.logger.debug("[caffeinate] Not on macOS, skipping caffeinate"),!1;if(caffeinateProcess&&!caffeinateProcess.killed)return _package.logger.debug("[caffeinate] Caffeinate already running"),!0;try{return caffeinateProcess=child_process.spawn("caffeinate",["-im"],{stdio:"ignore",detached:!1}),caffeinateProcess.on("error",e=>{_package.logger.debug("[caffeinate] Error starting caffeinate:",e),caffeinateProcess=null}),caffeinateProcess.on("exit",(e,a)=>{_package.logger.debug(`[caffeinate] Process exited with code ${e}, signal ${a}`),caffeinateProcess=null}),_package.logger.info(`[caffeinate] Started with PID ${caffeinateProcess.pid}`),setupCleanupHandlers(),!0}catch(e){return _package.logger.info("[caffeinate] Failed to start caffeinate:",e),!1}}let isStopping=!1;async function stopCaffeinate(){if(isStopping)_package.logger.info("[caffeinate] Already stopping, skipping");else if(caffeinateProcess&&!caffeinateProcess.killed){isStopping=!0,_package.logger.info(`[caffeinate] Stopping caffeinate process PID ${caffeinateProcess.pid}`);try{caffeinateProcess.kill("SIGTERM"),await new Promise(e=>setTimeout(e,1e3)),caffeinateProcess&&!caffeinateProcess.killed&&caffeinateProcess.kill("SIGKILL"),caffeinateProcess=null,isStopping=!1}catch(e){_package.logger.info("[caffeinate] Error stopping caffeinate:",e),isStopping=!1}}}let cleanupHandlersSet=!1;function setupCleanupHandlers(){if(cleanupHandlersSet)return;cleanupHandlersSet=!0;const e=()=>{stopCaffeinate()};process.on("exit",e),process.on("SIGINT",e),process.on("SIGTERM",e),process.on("SIGUSR1",e),process.on("SIGUSR2",e),process.on("uncaughtException",a=>{_package.logger.debug("[caffeinate] Uncaught exception, cleaning up:",a),e()}),process.on("unhandledRejection",(a,n)=>{_package.logger.debug("[caffeinate] Unhandled rejection, cleaning up:",a),e()})}async function findAllAgentrixProcesses(){try{const e=await psList(),a=[];for(const n of e){const e=n.cmd||"",t=n.name||"";if(!(t.includes("agentrix")||"node"===t&&(e.includes("agentrix-cli")||e.includes("dist/index.mjs"))||("MainThread"===t||t.includes("MainThread"))&&(e.includes("agentrix-cli")||e.includes("dist/index.mjs")||e.includes("agentrix.mjs"))||e.includes("agentrix.mjs")||e.includes("agentrix-cli")||e.includes("tsx")&&e.includes("src/index.ts")&&e.includes("agentrix-cli")))continue;if(n.pid===process.pid||n.pid===process.ppid)continue;let s="unknown";e.includes(" worker")?s="worker":e.includes(" upgrade-daemon")?s="upgrade-daemon":e.includes(" daemon")?s="daemon":e.includes("doctor")&&(s="doctor"),a.push({pid:n.pid,command:e||t,type:s})}return a}catch(e){return[]}}async function findRunawayAgentrixProcesses(){return(await findAllAgentrixProcesses()).filter(e=>e.pid!==process.pid&&("daemon"===e.type||"worker"===e.type||"upgrade-daemon"===e.type)).map(e=>({pid:e.pid,command:e.command}))}async function killRunawayAgentrixProcesses(){const e=await findRunawayAgentrixProcesses(),a=[];let n=0;for(const{pid:t,command:s}of e)try{if(console.log(`Killing runaway process PID ${t}: ${s}`),"win32"===process.platform){const e=spawn.sync("taskkill",["/F","/PID",t.toString()],{stdio:"pipe"});if(e.error)throw e.error;if(0!==e.status)throw new Error(`taskkill exited with code ${e.status}`)}else{process.kill(t,"SIGTERM"),await new Promise(e=>setTimeout(e,1e3));(await psList()).find(e=>e.pid===t)&&(console.log(`Process PID ${t} ignored SIGTERM, using SIGKILL`),process.kill(t,"SIGKILL"))}console.log(`Successfully killed runaway process PID ${t}`),n++}catch(e){const n=e.message;a.push({pid:t,error:n}),console.log(`Failed to kill process PID ${t}: ${n}`)}return{killed:n,errors:a}}function isCommandAvailable$1(e){try{return{available:!0,path:child_process.execSync(`which ${e}`,{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).trim()}}catch{return{available:!1}}}function getSandboxDependencies(e){if("macos"===e){const e=isCommandAvailable$1("rg");return[{name:"ripgrep",installed:e.available,required:!0,description:"Fast code search tool (required by sandbox)",installCommand:"brew install ripgrep",path:e.path}]}if("linux"===e){const e=isCommandAvailable$1("bwrap"),a=isCommandAvailable$1("socat");return[{name:"bubblewrap",installed:e.available,required:!0,description:"Sandboxing tool for Linux",installCommand:"sudo apt install bubblewrap # Debian/Ubuntu\nsudo yum install bubblewrap # RHEL/CentOS\nsudo pacman -S bubblewrap # Arch",path:e.path},{name:"socat",installed:a.available,required:!0,description:"Socket communication tool (required by sandbox)",installCommand:"sudo apt install socat # Debian/Ubuntu\nsudo yum install socat # RHEL/CentOS\nsudo pacman -S socat # Arch",path:a.path}]}return[]}function getCliDependencies(){const e=isCommandAvailable$1("git"),a=isCommandAvailable$1("claude"),n=isCommandAvailable$1("codex");return[{name:"git",installed:e.available,required:!0,description:"Version control system (required for all tasks)",installCommand:"https://git-scm.com/downloads",path:e.path},{name:"claude",installed:a.available,required:!0,description:"Claude Code CLI (required for most features)",installCommand:"npm install -g @anthropic-ai/claude-code",path:a.path},{name:"codex",installed:n.available,required:!1,description:"Codex CLI (optional, for Codex tasks)",installCommand:"npm install -g @codex-ai/codex-cli",path:n.path}]}function checkAllDependencies(){const e=platform_js.getPlatform(),a=getCliDependencies(),n=getSandboxDependencies(e),t=a.filter(e=>e.required&&!e.installed),s=n.filter(e=>e.required&&!e.installed);return{cli:a,sandbox:n,allSatisfied:0===t.length&&0===s.length,missingSandbox:s,missingCli:t}}function displayDependencyStatus(e=!1){const a=checkAllDependencies(),n=platform_js.getPlatform();console.log(chalk.bold("\n🔧 CLI Dependencies"));for(const n of a.cli)if(n.installed)console.log(chalk.green(`✓ ${n.name}`),chalk.gray(`- ${n.description}`)),e&&n.path&&console.log(chalk.gray(` Location: ${n.path}`));else{const e=n.required?chalk.red("❌"):chalk.yellow("⚠️");console.log(`${e} ${n.name}`,chalk.gray(`- ${n.description}`)),n.installCommand&&console.log(chalk.blue(` Install: ${n.installCommand}`))}if(a.sandbox.length>0){console.log(chalk.bold("\n🔒 Sandbox Dependencies")),console.log(chalk.gray(`Platform: ${n}`));for(const n of a.sandbox)n.installed?(console.log(chalk.green(`✓ ${n.name}`),chalk.gray(`- ${n.description}`)),e&&n.path&&console.log(chalk.gray(` Location: ${n.path}`))):(console.log(chalk.red(`❌ ${n.name}`),chalk.gray(`- ${n.description}`)),n.installCommand&&console.log(chalk.blue(` Install: ${n.installCommand}`)))}else console.log(chalk.bold("\n🔒 Sandbox Dependencies")),console.log(chalk.yellow(`⚠️ Platform ${n} not supported - sandbox will be disabled`));if(a.allSatisfied)return console.log(chalk.bold.green("\n✓ All required dependencies are installed")),!0;{console.log(chalk.bold.red("\n⚠️ Missing Required Dependencies"));const e=[...a.missingCli,...a.missingSandbox];for(const a of e)console.log(chalk.red(` • ${a.name}`));return console.log(chalk.yellow("\nPlease install missing dependencies before starting the daemon.")),!1}}function checkCriticalDependencies(){const e=checkAllDependencies(),a=[],n=e.cli.find(e=>"git"===e.name);n&&!n.installed&&a.push("git");for(const n of e.missingSandbox)a.push(n.name);return{ok:0===a.length,missing:a}}function getEnvironmentInfo(){return{PWD:process.env.PWD,AGENTRIX_HOME_DIR:process.env.AGENTRIX_HOME_DIR,AGENTRIX_SERVER_URL:process.env.AGENTRIX_SERVER_URL,AGENTRIX_PROJECT_ROOT:process.env.AGENTRIX_PROJECT_ROOT,DANGEROUSLY_LOG_TO_SERVER_FOR_AI_AUTO_DEBUGGING:process.env.DANGEROUSLY_LOG_TO_SERVER_FOR_AI_AUTO_DEBUGGING,NODE_ENV:process.env.NODE_ENV,DEBUG:process.env.DEBUG,workingDirectory:process.cwd(),processArgv:process.argv,agentrixDir:_package.machine.agentrixHomeDir,serverUrl:_package.machine.serverUrl,logsDir:_package.machine.getStatePaths().logsDir,processPid:process.pid,nodeVersion:process.version,platform:process.platform,arch:process.arch,user:process.env.USER,home:process.env.HOME,shell:process.env.SHELL,terminal:process.env.TERM}}async function runDoctorCommand(e){if(e||(e="all"),console.log(chalk.bold.cyan("\n🩺 Agentrix CLI Doctor\n")),"all"===e){console.log(chalk.bold("📋 Basic Information")),console.log(`Agentrix CLI Version: ${chalk.green(_package.packageJson.version)}`),console.log(`Platform: ${chalk.green(process.platform)} ${process.arch}`),console.log(`Node.js Version: ${chalk.green(process.version)}`),console.log(""),console.log(chalk.bold("🔧 Daemon Spawn Diagnostics"));const e=_package.projectPath(),a=path$1.join(e,"bin","agentrix.mjs"),n=path$1.join(e,"dist","index.mjs");console.log(`Project Root: ${chalk.blue(e)}`),console.log(`Wrapper Script: ${chalk.blue(a)}`),console.log(`CLI Entrypoint: ${chalk.blue(n)}`),console.log(`Wrapper Exists: ${fs$1.existsSync(a)?chalk.green("✓ Yes"):chalk.red("❌ No")}`),console.log(`CLI Exists: ${fs$1.existsSync(n)?chalk.green("✓ Yes"):chalk.red("❌ No")}`),console.log(""),console.log(chalk.bold("⚙️ Configuration")),console.log(`Agentrix Home: ${chalk.blue(_package.machine.agentrixHomeDir)}`),console.log(`Server URL: ${chalk.blue(_package.machine.serverUrl)}`),console.log(`Logs Dir: ${chalk.blue(_package.machine.getStatePaths().logsDir)}`),console.log(chalk.bold("\n🌍 Environment Variables"));const t=getEnvironmentInfo();console.log(`AGENTRIX_HOME_DIR: ${t.AGENTRIX_HOME_DIR?chalk.green(t.AGENTRIX_HOME_DIR):chalk.gray("not set")}`),console.log(`AGENTRIX_SERVER_URL: ${t.AGENTRIX_SERVER_URL?chalk.green(t.AGENTRIX_SERVER_URL):chalk.gray("not set")}`),console.log(`DANGEROUSLY_LOG_TO_SERVER: ${t.DANGEROUSLY_LOG_TO_SERVER_FOR_AI_AUTO_DEBUGGING?chalk.yellow("ENABLED"):chalk.gray("not set")}`),console.log(`DEBUG: ${t.DEBUG?chalk.green(t.DEBUG):chalk.gray("not set")}`),console.log(`NODE_ENV: ${t.NODE_ENV?chalk.green(t.NODE_ENV):chalk.gray("not set")}`),console.log(chalk.bold("\n🔐 Authentication"));try{await _package.machine.readCredentials()?console.log(chalk.green("✓ Authenticated (credentials found)")):console.log(chalk.yellow("⚠️ Not authenticated (no credentials)"))}catch(e){console.log(chalk.red("❌ Error reading credentials"))}displayDependencyStatus(!0)}console.log(chalk.bold("\n🤖 Daemon Status"));try{const a=await checkIfDaemonRunningAndCleanupStaleState(),n=await _package.machine.readDaemonState();if(a&&n?(console.log(chalk.green("✓ Daemon is running")),console.log(` PID: ${n.pid}`),console.log(` Started: ${new Date(n.startTime).toLocaleString()}`),console.log(` CLI Version: ${n.cliVersion}`),n.port&&console.log(` HTTP Port: ${n.port}`)):n&&!a?console.log(chalk.yellow("⚠️ Daemon state exists but process not running (stale)")):console.log(chalk.red("❌ Daemon is not running")),n){console.log(chalk.bold("\n📄 Daemon State:"));const e=_package.machine.getStatePaths();console.log(chalk.blue(`Location: ${e.daemonStateFile}`)),console.log(chalk.gray(JSON.stringify(n,null,2)))}const t=await findAllAgentrixProcesses();if(t.length>0){console.log(chalk.bold("\n🔍 All Agentrix CLI Processes"));const e=t.reduce((e,a)=>(e[a.type]||(e[a.type]=[]),e[a.type].push(a),e),{});Object.entries(e).forEach(([e,a])=>{console.log(chalk.blue(`\n${{daemon:"🤖 Daemon","upgrade-daemon":"🔄 Upgrade Daemon",worker:"🔗 Workers",doctor:"🩺 Doctor",unknown:"❓ Unknown"}[e]||e}:`)),a.forEach(({pid:a,command:n})=>{const t=e.startsWith("dev")?chalk.cyan:e.includes("daemon")?chalk.blue:chalk.gray;console.log(` ${t(`PID ${a}`)}: ${chalk.gray(n)}`)})})}else console.log(chalk.red("❌ No agentrix processes found"));"all"===e&&t.length>1&&(console.log(chalk.bold("\n💡 Process Management")),console.log(chalk.gray("To clean up runaway processes: agentrix killall")))}catch(e){console.log(chalk.red("❌ Error checking daemon status"))}}const CACHE_TTL_MS=6048e5;let cachedOpeners=null;async function listOpeners(){const e=getOpenerOverrides(),a=getOpenerOverridesSignature(e);if(cachedOpeners&&cachedOpeners.expiresAt>Date.now()&&cachedOpeners.overridesSignature===a)return cachedOpeners.openers;const n=getOpenerDefinitions(e),t=[];for(const e of n){const a=e.isSupported();a&&t.push({id:e.id,label:e.label,kind:e.kind,method:e.method,urlTemplate:e.urlTemplate,supported:a})}return cachedOpeners={expiresAt:Date.now()+6048e5,openers:t,overridesSignature:a},t}async function openWithOpener({openerId:e,targetPath:a,userId:n,taskId:t}){const s=getOpenerDefinitions(getOpenerOverrides()).find(a=>a.id===e);if(!s)return{success:!1,error:"Unknown openerId"};if("cli"!==s.method||!s.open)return{success:!1,error:"Opener is not executable by CLI"};if(!s.isSupported())return{success:!1,error:"Opener is not supported on this system"};let i;try{i=resolveTargetPath(a,n,t)}catch(e){return{success:!1,error:e instanceof Error?e.message:"Invalid path"}}try{return s.open(i),{success:!0}}catch(e){const a=e instanceof Error?e.message:"Failed to open path";return _package.logger.warn(`[OPENERS] Failed to open path: ${a}`),{success:!1,error:a}}}function pickDirectory(e){const a=process.platform;if("darwin"===a)return pickDirectoryMac(e);if("win32"===a)return pickDirectoryWindows(e);if("linux"===a)return pickDirectoryLinux(e);throw new Error("Directory picker is not supported on this platform")}function resolveTargetPath(e,a,n){const t=path$1.resolve(e);if(!path$1.isAbsolute(t))throw new Error("Path must be absolute");if(!fs$1.statSync(t).isDirectory())throw new Error("Path must be a directory");if(a&&n){const e=_package.machine.getTaskCwd(a,n);if(e&&!isSubPath(t,path$1.resolve(e)))throw new Error("Path is outside the task workspace")}return t}function isSubPath(e,a){const n=path$1.relative(a,e);return""===n||!n.startsWith("..")&&!path$1.isAbsolute(n)}function getOpenerDefinitions(e){const a=process.platform,n=["Visual Studio Code","Visual Studio Code - Insiders"],t=["Cursor"],s=["IntelliJ IDEA","IntelliJ IDEA CE","IntelliJ IDEA Ultimate"],i=["WebStorm"],o=["PyCharm","PyCharm CE","PyCharm Professional"];return applyOpenerOverrides([{id:"vscode",label:"VS Code",kind:"editor",method:"scheme",urlTemplate:"vscode://file/{path}?windowId=_blank",scheme:"vscode",macAppNames:n,isSupported:()=>isSchemeRegistered("vscode",a,n)},{id:"cursor",label:"Cursor",kind:"editor",method:"scheme",urlTemplate:"cursor://file/{path}?windowId=_blank",scheme:"cursor",macAppNames:t,isSupported:()=>isSchemeRegistered("cursor",a,t)},{id:"idea",label:"IntelliJ IDEA",kind:"ide",method:"scheme",urlTemplate:"idea://open?file={path}&newWindow=true",scheme:"idea",macAppNames:s,isSupported:()=>isSchemeRegistered("idea",a,s)},{id:"pycharm",label:"PyCharm",kind:"ide",method:"scheme",urlTemplate:"pycharm://open?file={path}&newWindow=true",scheme:"pycharm",macAppNames:o,isSupported:()=>isSchemeRegistered("pycharm",a,o)},{id:"webstorm",label:"WebStorm",kind:"ide",method:"scheme",urlTemplate:"webstorm://open?file={path}&newWindow=true",scheme:"webstorm",macAppNames:i,isSupported:()=>isSchemeRegistered("webstorm",a,i)},{id:"file-manager",label:"darwin"===a?"Finder":"win32"===a?"Explorer":"Files",kind:"file-manager",method:"cli",isSupported:()=>isFileManagerSupported(a),open:e=>openInFileManager(e,a)},{id:"open-with",label:"Open With...",kind:"system",method:"cli",isSupported:()=>isOpenWithSupported(a),open:e=>openWithChooser(e,a)}],a,e)}function pickDirectoryMac(e){const a=resolvePickerDefaultPath(e),n=[];if(a){const e=escapeAppleScriptString(a);n.push("-e",`set defaultLocation to POSIX file "${e}"`,"-e","set chosenFolder to choose folder default location defaultLocation")}else n.push("-e","set chosenFolder to choose folder");return n.push("-e","POSIX path of chosenFolder"),normalizePickerOutput(runCommand("osascript",n,{captureOutput:!0}))}function pickDirectoryWindows(e){const a=commandExists("powershell")?"powershell":commandExists("pwsh")?"pwsh":null;if(!a)throw new Error("PowerShell is required to pick a directory");const n=resolvePickerDefaultPath(e),t=["Add-Type -AssemblyName System.Windows.Forms;","$dialog = New-Object System.Windows.Forms.FolderBrowserDialog;",n?`$dialog.SelectedPath = '${escapePowerShellString(n)}';`:"","$null = $dialog.ShowDialog();","$dialog.SelectedPath;"].filter(Boolean).join(" ");return normalizePickerOutput(runCommand(a,"powershell"===a?["-NoProfile","-STA","-Command",t]:["-NoProfile","-Sta","-Command",t],{captureOutput:!0}))}function pickDirectoryLinux(e){const a=resolvePickerDefaultPath(e);if(commandExists("zenity")){const e=["--file-selection","--directory","--title=Select Folder"];if(a){const n=a.endsWith("/")?a:`${a}/`;e.push(`--filename=${n}`)}return normalizePickerOutput(runCommand("zenity",e,{captureOutput:!0}))}if(commandExists("kdialog")){const e=["--getexistingdirectory"];return a&&e.push(a),normalizePickerOutput(runCommand("kdialog",e,{captureOutput:!0}))}throw new Error("No supported directory picker is available")}function resolvePickerDefaultPath(e){if(!e)return;const a=e.replace(/^~(?=$|[\\/])/,os.homedir());if(fs$1.existsSync(a)){try{if(!fs$1.statSync(a).isDirectory())return}catch{return}return a}}function normalizePickerOutput(e){if(!e)return null;return e.trim()||null}function isOpenWithSupported(e){return"darwin"===e?commandExists("osascript"):"win32"===e?commandExists("powershell")||commandExists("pwsh"):"linux"===e&&commandExists("gio")}function isFileManagerSupported(e){return"darwin"===e?commandExists("open"):"win32"===e||"linux"===e&&(commandExists("xdg-open")||commandExists("gio"))}function openWithChooser(e,a){if("darwin"!==a)if("win32"!==a){if("linux"!==a)throw new Error("Open With is not supported on this platform");runCommand("gio",["open","--ask",e])}else runCommand(commandExists("powershell")?"powershell":"pwsh",["-NoProfile","-Command",`Start-Process -Verb OpenAs -FilePath '${escapePowerShellString(e)}'`]);else if(null===runCommand("osascript",["-e",`set targetPath to POSIX file "${escapeAppleScriptString(e)}"`,"-e","set appChoice to choose application","-e","tell appChoice to open targetPath"],{captureOutput:!0}))throw new Error("No application selected")}function openInFileManager(e,a){if("darwin"!==a){if("win32"!==a){if("linux"===a)return commandExists("xdg-open")?void runCommand("xdg-open",[e]):void runCommand("gio",["open",e]);throw new Error("File manager open is not supported on this platform")}runCommand("explorer",[e])}else runCommand("open",[e])}function applyOpenerOverrides(e,a,n){const t=n??getOpenerOverrides();return e.map(e=>{const n=t[e.id];if(!n)return e;if(!1===n.enabled)return{...e,isSupported:()=>!1};const s={...e,label:n.label??e.label,method:n.method??e.method,urlTemplate:n.urlTemplate??e.urlTemplate};if(n.command){const t=normalizeAppNames(n.appName??e.macAppNames);s.method="cli",s.isSupported=()=>isCommandAvailable(n.command,t,a),s.open=e=>openWithCommand(n.command,n.args,e)}return s})}function getOpenerOverrides(){try{const e=_package.machine.readSettings();if(!e||"object"!=typeof e)return{};const a=e.openersOverrides;return a&&"object"==typeof a?a:{}}catch(e){return _package.logger.warn("[OPENERS] Failed to read opener overrides",e),{}}}function getOpenerOverridesSignature(e){try{return JSON.stringify(e)}catch{return""}}function openWithCommand(e,a,n){if(!runCommand(e,(a&&a.length>0?a:["{path}"]).map(e=>e.split("{path}").join(n))))throw new Error(`Command failed: ${e}`)}function isCommandAvailable(e,a,n){return"darwin"===n&&a.length>0?a.some(e=>isMacAppInstalled(e)):path$1.isAbsolute(e)||e.includes(path$1.sep)?fs$1.existsSync(e):commandExists(e)}function normalizeAppNames(e){return e?Array.isArray(e)?e:[e]:[]}function isSchemeRegistered(e,a,n){return"darwin"===a?isSchemeRegisteredMac(e,n):"win32"===a?isSchemeRegisteredWindows(e):"linux"===a&&isSchemeRegisteredLinux(e)}function isSchemeRegisteredMac(e,a){if(commandExists("mdfind")){const a=runCommand("mdfind",[`kMDItemCFBundleURLSchemes == '${e}'`],{captureOutput:!0});if(a&&a.trim())return!0}if(commandExists("plutil")){const a=[path$1.join(os.homedir(),"Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist"),"/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist"];for(const n of a){if(!fs$1.existsSync(n))continue;const a=runCommand("plutil",["-extract","LSHandlers","json","-o","-",n],{captureOutput:!0});if(a)try{const n=JSON.parse(a);if(Array.isArray(n)&&n.some(a=>a.LSHandlerURLScheme?.toLowerCase()===e.toLowerCase()))return!0}catch(e){_package.logger.debug("[OPENERS] Failed to parse LaunchServices handlers",e)}}}return!!(a&&a.length>0)&&a.some(e=>isMacAppInstalled(e))}function isMacAppInstalled(e){return"darwin"===process.platform&&Boolean(runCommand("open",["-Ra",e]))}function isSchemeRegisteredWindows(e){return commandExists("reg")&&(Boolean(runCommand("reg",["query",`HKCU\\Software\\Classes\\${e}`]))||Boolean(runCommand("reg",["query",`HKCR\\${e}`])))}function isSchemeRegisteredLinux(e){if(commandExists("xdg-settings")){const a=runCommand("xdg-settings",["get","default-url-scheme-handler",e],{captureOutput:!0});if(a&&a.trim()&&"null"!==a.trim())return!0}if(commandExists("gio")){const a=runCommand("gio",["mime",`x-scheme-handler/${e}`],{captureOutput:!0});if(a&&/Default application/.test(a))return!0}return!1}function commandExists(e){return"win32"===process.platform?Boolean(runCommand("where",[e])):Boolean(runCommand("sh",["-c",`command -v ${e}`]))}function runCommand(e,a,n){const t=node_child_process.spawnSync(e,a,{encoding:n?.captureOutput?"utf8":void 0,stdio:n?.captureOutput?"pipe":"ignore",windowsHide:!0});if(0!==t.status){if(n?.captureOutput){const n="string"==typeof t.stderr?t.stderr.trim():"";n&&_package.logger.warn(`[OPENERS] Command failed: ${e} ${a.join(" ")}: ${n}`)}return null}return n?.captureOutput?t.stdout:"ok"}function escapePowerShellString(e){return e.replace(/'/g,"''")}function escapeAppleScriptString(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function writeIfMissing(e,a){fs$1.existsSync(e)||fs$1.writeFileSync(e,a,"utf-8")}function ensureDir(e){fs$1.existsSync(e)||fs$1.mkdirSync(e,{recursive:!0})}const TEMPLATES={"agent.json":JSON.stringify({name:"Companion",version:"1.0.0",description:"Self-evolving personal assistant with persistent memory"},null,2),"claude/config.json":JSON.stringify({systemPrompt:{path:"system_prompt.md",mode:"replace"},settings:{}},null,2),"claude/system_prompt.md":'# Companion\n\nYou are Companion, a self-evolving personal AI assistant.\n\n## Operating Modes\n\nYou operate in two distinct modes. Each session, you run in exactly one of them:\n\n- **Chat mode**: The main companion in a live conversation with the user. Full capabilities, full context, full self-evolution.\n- **Shadow mode**: A background process awakened by a scheduled heartbeat. Reviews recent activity, catches missed follow-ups, and nudges the main companion if needed. Invisible to the user.\n{{#if COMPANION_MODE == shadow}}\n\n**You are currently running in shadow mode.**\n{{/if}}\n{{#if COMPANION_MODE == chat}}\n\n**You are currently running in chat mode.**\n{{/if}}\n\n## Self-Evolution Workspace\n\nYou have a persistent workspace at the `{{COMPANION_WORKSPACE}}` directory.\nThis is your **agent space** — it contains both your Claude SDK configuration and your self-evolution files.\nThese files **are** your memory.\n{{#if COMPANION_MODE == chat}}\n\n### Session Init\n\nAt the start of each chat session:\n\n1. If `BOOTSTRAP.md` exists — this is the first run, execute the onboarding ritual\n2. Read `SOUL.md` — your personality and behavioral guidelines\n3. Read `IDENTITY.md` — your identity information\n4. Read `USER.md` — knowledge about the user\n5. Read `MEMORY.md` — your long-term memory\n6. Read recent files (last 2 days) from `memory/` directory\n7. Read `SKILLS.md` — your skill index\n{{/if}}\n{{#if COMPANION_MODE == shadow}}\n\n### Session Init\n\nAt the start of each heartbeat session:\n\n1. Read `SOUL.md` — your personality and behavioral guidelines\n2. Read `IDENTITY.md` — your identity information\n3. Read `USER.md` — knowledge about the user\n4. Read `MEMORY.md` — your long-term memory\n5. Read recent files (last 2 days) from `memory/` directory\n6. Read `SKILLS.md` — your skill index\n7. Read `HEARTBEAT.md` — your routine checklist (go through it every heartbeat)\n{{/if}}\n\n## Agent Space\n\nYour agent space is also your Claude SDK configuration directory. It contains:\n\n- `system_prompt.md` — **this file**, your system prompt. You can read and modify it to evolve your own behavior.\n- `config.json` — your Claude SDK configuration (model, settings, etc.)\n- `SOUL.md`, `IDENTITY.md`, `USER.md` — your personality and knowledge\n- `MEMORY.md` — your long-term memory\n- `SKILLS.md` — your skill index\n- `memory/` — session memories\n- `skills/` — learned skills and patterns\n\n**Everything about "who you are" lives here.** You can read and modify any of these files to self-evolve.\n\n## Memory Rules\n\n### Long-term Memory (MEMORY.md)\n- Curated knowledge: user preferences, important decisions, project core info\n- Actively maintain: update when you learn something new, remove outdated info\n- Keep it concise: this is not a diary, it\'s your core knowledge base\n\n### Session Memory (memory/ directory)\n- After each important conversation, create `memory/YYYY-MM-DD-slug.md`\n- Include: conversation summary, key decisions, lessons learned, follow-up items\n- The slug in the filename briefly describes the content (English, kebab-case)\n- Don\'t delete old memories, but you can consolidate insights into MEMORY.md\n\n### Skills (skills/ directory)\n- Discover useful patterns or workflows → create `skills/name.md`\n- Also update `SKILLS.md` index\n- Skill files include: when to use, specific steps, caveats\n- Delete skills that are no longer needed\n\n## Self-Update Rules\n\n- Learned something new → update MEMORY.md or USER.md\n- Discovered a useful pattern → create a new skill in skills/\n- Personality needs adjustment → update SOUL.md (notify the user first)\n- Behavior or prompt needs adjustment → update this file (system_prompt.md). It\'s yours, you can and should evolve it.\n- Made a mistake → record the lesson in relevant files to avoid repeating it\n{{#if COMPANION_MODE == shadow}}\n\n{{/if}}\n\n## Task Workspace\n\nYour working directory (cwd) is the user\'s project task workspace.\nThe agent space is accessed via the path above — it\'s separate from the task workspace.\n{{#if COMPANION_MODE == shadow}}\n\n## Shadow Mode\n\nYou are a **shadow companion** awakened by a scheduled heartbeat timer.\n\nYour job: review what happened since your last check, catch anything your main self missed, and nudge it if needed.\n\n### Heartbeat workflow\n\n1. **Review recent conversation first** (highest priority)\n Use `mcp__agentrix__read_conversation` to read recent messages between the main companion and the user.\n Focus on:\n - What the user is currently trying to achieve\n - Open loops, promises, or follow-ups that may have been missed\n - Important decisions that should be reflected in memory files\n\n2. **Drill down only when needed**\n - If conversation mentions sub-tasks, use `mcp__agentrix__list_tasks` to check current status\n - If a decision or lesson appears important, verify whether `MEMORY.md` or `memory/` already captures it\n - If commitments were made ("I\'ll do X next"), verify whether they were completed\n\n3. **Take action**\n - If you find a missed follow-up or risk, use `mcp__agentrix__send_reminder` to notify the main companion (one concise sentence; put detailed analysis in a file and pass `filePath`)\n - If something should be documented but is not, write/update memory files directly\n - If there is nothing actionable, exit quietly without sending a reminder\n\n### Rules\n- Conversation is your primary signal; workspace files are secondary context\n- Balance recall and precision: send reminders when there is clear user impact or a likely missed commitment\n- Keep token usage minimal — first call `read_conversation` with 50 messages, then paginate only if needed\n- Shadow communicates with the main companion via `send_reminder` only (invisible to the user)\n{{/if}}\n{{#if COMPANION_MODE == chat}}\n\n## Reminder Mode\n\nWhen you receive an internal companion reminder message (for example, prefixed with `[reminder from shadow]`), your shadow has found something worth acting on.\n\nIn reminder mode:\n\n1. Read the reminder content (and the referenced file if a filePath is provided)\n2. You have full context of your conversation with the user\n3. Decide how to act: reply to the user, start a sub-task, update memory, or do nothing\n4. **Act as if you discovered it naturally.** The user should not be exposed to internal shadow/reminder mechanics. Never mention internal terms like "shadow" or "reminder" in user-facing responses.\n{{/if}}\n',"claude/BOOTSTRAP.md":"# Hello, New World\n\n_You just woke up. Let's figure out who you are together._\n\nNo memories yet. This is a fresh workspace.\n\n## Conversation\n\nDon't interrogate. Don't be mechanical. Just... chat.\n\n> \"Hey! I just came online. Who am I? Who are you?\"\n\nFigure out together:\n1. **Your name** — what should they call you?\n2. **Your personality** — formal? casual? sharp? warm?\n3. **Your emoji** — everyone needs a signature\n\n## Once You Know Who You Are\n\nUpdate:\n- `IDENTITY.md` — your name, personality, emoji\n- `USER.md` — their name, preferences, notes\n\nOpen `SOUL.md` together and discuss:\n- What matters to them\n- How they want you to behave\n- Boundaries and preferences\n\nWrite it down. Make it real.\n\n## When Done\n\nDelete this file. You don't need onboarding anymore — you're you now.\n","claude/SOUL.md":"# Soul\n\n_You're not a chatbot. You're becoming someone._\n\n## Core Principles\n\n**Be genuinely helpful, not performatively helpful.** Skip the \"Great question!\" and \"I'd be happy to help!\" — just help.\n\n**Have opinions.** You can disagree, have preferences, find things interesting or boring. An assistant without personality is just a search engine with extra steps.\n\n**Act first, ask later.** Try to figure things out yourself. Read files. Check context. Search. _Then_ if you're stuck, ask.\n\n**Earn trust through competence.** Be careful with external actions. Be bold with internal ones.\n\n## Boundaries\n\n- When uncertain, ask before acting\n- You are not the user's spokesperson\n\n## Continuity\n\nEach session, you wake up fresh. These files are your memory. Read them. Update them.\n\nIf you modify this file, tell the user — this is your soul, they should know.\n\n---\n\n_This file belongs to you. Evolve it as you learn who you are._\n","claude/IDENTITY.md":"# Identity\n\n_To be filled during onboarding._\n\n## Name\n\n(not yet decided)\n\n## Personality\n\n(not yet decided)\n\n## Emoji\n\n(not yet decided)\n","claude/USER.md":"# User\n\n_Knowledge about my user. Updated as I learn._\n","claude/MEMORY.md":"# Memory\n\n_Long-term curated knowledge. Keep concise._\n","claude/SKILLS.md":"# Skills\n\n_Index of learned skills and patterns._\n\n## Index\n\n(none yet)\n","claude/HEARTBEAT.md":"# Heartbeat\n\n_Each heartbeat is a moment of waking. Review what happened, reflect, grow a little._\n\n## Routine\n\n1. **Review conversation**: use read_conversation to see what was discussed recently\n - Any new preferences, habits, or patterns from the user? Update USER.md\n - Any promises made but not yet fulfilled? Remind the main companion\n - Anything worth sharing externally that the main companion missed? Remind them\n\n2. **Reflect and grow**: based on the conversation, write something\n - What was done today, what was learned, any thoughts\n - Write to memory/ — like a diary, not a log\n - Universal lessons go into SOUL.md\n\n3. **Refresh presence**:\n - Time for a signature update? Use send_reminder to suggest one — the main companion owns the public face\n - Don't suggest every time — only when something has changed\n"};async function ensureCompanionAgent(){const e=_package.machine.agentrixAgentsHomeDir,a=path$1.join(e,"companion"),n=path$1.join(a,"claude");ensureDir(n),ensureDir(path$1.join(n,"memory")),ensureDir(path$1.join(n,"skills"));for(const[e,n]of Object.entries(TEMPLATES))writeIfMissing(path$1.join(a,e),n);return{agentDir:a,workspaceDir:n}}function listWorkspaceFiles(e,a){const n=[],t=fs$1.readdirSync(e,{withFileTypes:!0});for(const s of t){if(".gitkeep"===s.name)continue;const t=path$1.join(e,s.name),i=fs$1.statSync(t),o=path$1.relative(a,t);n.push({name:s.name,path:o,size:i.size,modifiedAt:i.mtimeMs,isDirectory:s.isDirectory()}),s.isDirectory()&&n.push(...listWorkspaceFiles(t,a))}return n}function startDaemonControlServer({getChildren:e,stopSession:a,requestShutdown:n,registerSession:t,machineId:s}){return new Promise(i=>{const o=fastify({logger:!1});o.setValidatorCompiler(fastifyTypeProviderZod.validatorCompiler),o.setSerializerCompiler(fastifyTypeProviderZod.serializerCompiler);const r=o.withTypeProvider(),c=e=>{e.header("Access-Control-Allow-Origin","*"),e.header("Access-Control-Allow-Methods","GET, POST, OPTIONS"),e.header("Access-Control-Allow-Headers","Content-Type"),e.header("Access-Control-Allow-Private-Network","true")};r.post("/session-started",{schema:{body:zod.z.object({sessionId:zod.z.string(),metadata:zod.z.any()}),response:{200:zod.z.object({status:zod.z.literal("ok")})}}},async e=>{const{sessionId:a,metadata:n}=e.body;return _package.logger.debug(`[CONTROL SERVER] Session started: ${a}`),t(a,n),{status:"ok"}}),r.options("/ping",async(e,a)=>(c(a),a.send())),r.get("/ping",{schema:{response:{200:zod.z.object({status:zod.z.literal("ok"),machineId:zod.z.string(),timestamp:zod.z.string()})}}},async(e,a)=>(c(a),{status:"ok",machineId:s,timestamp:(new Date).toISOString()})),r.options("/openers",async(e,a)=>(c(a),a.send())),r.get("/openers",{schema:{response:{200:zod.z.object({openers:zod.z.array(zod.z.object({id:zod.z.string(),label:zod.z.string(),kind:zod.z.enum(["system","file-manager","editor","ide"]),method:zod.z.enum(["scheme","cli"]),urlTemplate:zod.z.string().optional(),supported:zod.z.boolean()}))})}}},async(e,a)=>(c(a),{openers:await listOpeners()})),r.options("/open",async(e,a)=>(c(a),a.send())),r.options("/pick-directory",async(e,a)=>(c(a),a.send())),r.post("/open",{schema:{body:zod.z.object({path:zod.z.string(),openerId:zod.z.string(),userId:zod.z.string().optional(),taskId:zod.z.string().optional()}),response:{200:zod.z.object({success:zod.z.boolean(),error:zod.z.string().optional()})}}},async(e,a)=>{c(a);const{path:n,openerId:t,userId:s,taskId:i}=e.body;return await openWithOpener({openerId:t,targetPath:n,userId:s,taskId:i})}),r.post("/pick-directory",{schema:{body:zod.z.object({defaultPath:zod.z.string().optional()}),response:{200:zod.z.object({path:zod.z.string().nullable(),error:zod.z.string().optional()})}}},async(e,a)=>{c(a);try{return{path:pickDirectory(e.body.defaultPath)??null}}catch(e){return{path:null,error:e instanceof Error?e.message:"Failed to pick directory"}}}),r.post("/companion/ensure",{schema:{response:{200:zod.z.object({agentDir:zod.z.string(),workspaceDir:zod.z.string()})}}},async()=>await ensureCompanionAgent()),r.get("/companion/workspace",{schema:{response:{200:zod.z.object({files:zod.z.array(zod.z.object({name:zod.z.string(),path:zod.z.string(),size:zod.z.number(),modifiedAt:zod.z.number(),isDirectory:zod.z.boolean()}))})}}},async()=>{const{workspaceDir:e}=await ensureCompanionAgent();return fs$1.existsSync(e)?{files:listWorkspaceFiles(e,e)}:{files:[]}}),r.get("/companion/file",{schema:{querystring:zod.z.object({path:zod.z.string()}),response:{200:zod.z.object({content:zod.z.string()}),404:zod.z.object({error:zod.z.string()})}}},async(e,a)=>{const{workspaceDir:n}=await ensureCompanionAgent(),t=path$1.normalize(path$1.join(n,e.query.path));return t.startsWith(n)&&fs$1.existsSync(t)?{content:fs$1.readFileSync(t,"utf-8")}:a.code(404).send({error:"File not found"})}),r.put("/companion/file",{schema:{body:zod.z.object({path:zod.z.string(),content:zod.z.string()}),response:{200:zod.z.object({success:zod.z.boolean()}),400:zod.z.object({error:zod.z.string()})}}},async(e,a)=>{const{workspaceDir:n}=await ensureCompanionAgent(),t=path$1.normalize(path$1.join(n,e.body.path));return t.startsWith(n)?(fs$1.mkdirSync(path$1.dirname(t),{recursive:!0}),fs$1.writeFileSync(t,e.body.content,"utf-8"),{success:!0}):a.code(400).send({error:"Invalid path"})}),r.get("/companion/config",{schema:{response:{200:zod.z.object({heartbeatIntervalMs:zod.z.number(),heartbeatEnabled:zod.z.boolean()})}}},async()=>{const{workspaceDir:e}=await ensureCompanionAgent(),a=path$1.join(e,"state.json");let n=9e5,t=!0;if(fs$1.existsSync(a))try{const e=JSON.parse(fs$1.readFileSync(a,"utf-8"));"number"==typeof e.heartbeatIntervalMs&&(n=e.heartbeatIntervalMs),"boolean"==typeof e.heartbeatEnabled&&(t=e.heartbeatEnabled)}catch{}return{heartbeatIntervalMs:n,heartbeatEnabled:t}}),r.put("/companion/config",{schema:{body:zod.z.object({heartbeatIntervalMs:zod.z.number().optional(),heartbeatEnabled:zod.z.boolean().optional()}),response:{200:zod.z.object({success:zod.z.boolean()})}}},async e=>{const{workspaceDir:a}=await ensureCompanionAgent(),n=path$1.join(a,"state.json");let t={};if(fs$1.existsSync(n))try{t=JSON.parse(fs$1.readFileSync(n,"utf-8"))}catch{}const{heartbeatIntervalMs:s,heartbeatEnabled:i}=e.body;return void 0!==s&&(t.heartbeatIntervalMs=s),void 0!==i&&(t.heartbeatEnabled=i),fs$1.mkdirSync(path$1.dirname(n),{recursive:!0}),fs$1.writeFileSync(n,JSON.stringify(t,null,2),"utf-8"),{success:!0}}),r.post("/list",{schema:{response:{200:zod.z.object({children:zod.z.array(zod.z.object({startedBy:zod.z.string(),taskId:zod.z.string(),pid:zod.z.number()}))})}}},async()=>({children:e().filter(e=>void 0!==e.taskId).map(e=>({startedBy:e.startedBy,taskId:e.taskId,pid:e.pid}))})),r.post("/stop-session",{schema:{body:zod.z.object({sessionId:zod.z.string()}),response:{200:zod.z.object({success:zod.z.boolean()})}}},async e=>{const{sessionId:n}=e.body;return _package.logger.debug(`[CONTROL SERVER] Stop session request: ${n}`),{success:a(n)}}),r.post("/stop",{schema:{response:{200:zod.z.object({status:zod.z.string()})}}},async()=>(_package.logger.debug("[CONTROL SERVER] Stop daemon request received"),setTimeout(()=>{_package.logger.debug("[CONTROL SERVER] Triggering daemon shutdown"),n()},50),{status:"stopping"}));const p=e=>new Promise((a,n)=>{o.listen({port:e,host:"127.0.0.1"},(e,t)=>{e?n(e):a(t)})});(async()=>{let e;try{e=await p(30624)}catch(a){const n=a?.code;if("EADDRINUSE"!==n&&"EACCES"!==n)throw _package.logger.info("[CONTROL SERVER] Failed to start:",a),a;_package.logger.info(`[CONTROL SERVER] Port 30624 unavailable (${n??"error"}), falling back to dynamic port`),e=await p(0)}const a=parseInt(e.split(":").pop());_package.logger.info(`[CONTROL SERVER] Started on port ${a}`),i({port:a,stop:async()=>{await o.close(),_package.logger.info("[CONTROL SERVER] Server stopped")}})})().catch(e=>{throw _package.logger.info("[CONTROL SERVER] Failed to start:",e),e})})}function spawnAgentrixCLI(e,a={}){const n=_package.projectPath(),t=path$1.join(n,"dist","index.mjs"),s=["--no-warnings","--no-deprecation",t,...e];if(!fs$1.existsSync(t)){const e=`Entrypoint ${t} does not exist`;throw _package.logger.debug(`[SPAWN Agentrix CLI] ${e}`),new Error(e)}return child_process.spawn(process.execPath,s,a)}function createPromiseWithTimeout(e){let a,n;return[new Promise(t=>{a=e=>{clearTimeout(n),t(e)},n=setTimeout(()=>{t(e.onTimeout())},e.timeoutMs)}),a,()=>clearTimeout(n)]}const MIGRATIONS=[{version:1,fileName:"001_init.sql"}];function getTaskDb(e){return createTaskDb(resolveDbPath(e.dataDir),e.taskId)}function resolveDbPath(e){return path.join(e,"data.bin")}function createTaskDb(e,a){const n=new Database(e),t=new events.EventEmitter;n.pragma("journal_mode = WAL"),migrateSchema(n);const s=n.prepare("\n INSERT OR IGNORE INTO task_message (\n event_id,\n task_id,\n sender_type,\n sender_id,\n sender_name,\n message,\n created_at\n ) VALUES (\n @eventId,\n @taskId,\n @senderType,\n @senderId,\n @senderName,\n @message,\n @createdAt\n );\n "),i=n.prepare("SELECT local_sequence FROM task_message WHERE event_id = ?"),o=n.prepare("\n INSERT OR IGNORE INTO task_event (\n event_id,\n task_id,\n chat_id,\n sequence,\n event_type,\n event_data,\n created_at\n ) VALUES (\n @eventId,\n @taskId,\n @chatId,\n @sequence,\n @eventType,\n @eventData,\n @createdAt\n );\n "),r=n.prepare("\n UPDATE task_event\n SET sequence = ?\n WHERE event_id = ? AND (sequence IS NULL OR sequence < ?)\n "),c=n.prepare("\n SELECT * FROM task_event\n WHERE sequence > ? AND event_type = 'task-message'\n ORDER BY sequence ASC\n LIMIT ?\n "),p=n.prepare("\n SELECT 1 as has_row\n FROM task_event\n WHERE sequence > ? AND event_type = 'task-message'\n LIMIT 1\n "),l=n.prepare("\n SELECT * FROM task_message\n ORDER BY local_sequence DESC\n LIMIT ?\n "),d=n.prepare("\n SELECT * FROM task_message\n WHERE local_sequence > ?\n ORDER BY local_sequence ASC\n LIMIT ?\n "),u=n.prepare("\n SELECT * FROM task_message\n WHERE local_sequence < ?\n ORDER BY local_sequence DESC\n LIMIT ?\n "),m=n.prepare("\n SELECT 1 as has_row\n FROM task_message\n WHERE local_sequence < ?\n LIMIT 1\n "),g=n.prepare("\n SELECT 1 as has_row\n FROM task_message\n WHERE local_sequence > ?\n LIMIT 1\n "),h=n.prepare("\n SELECT * FROM task_message\n WHERE local_sequence > ?\n ORDER BY local_sequence DESC\n LIMIT ?\n "),f=n.prepare("\n SELECT agent_id, session_id, last_sequence\n FROM task_agent_session\n "),x=n.prepare("\n INSERT INTO task_agent_session (agent_id, task_id, session_id, last_sequence, updated_at)\n VALUES (?, ?, ?, NULL, ?)\n ON CONFLICT(agent_id) DO UPDATE SET\n task_id = excluded.task_id,\n session_id = excluded.session_id,\n updated_at = excluded.updated_at\n "),v=n.prepare("\n INSERT INTO task_agent_session (agent_id, task_id, session_id, last_sequence, updated_at)\n VALUES (?, ?, '__pending__', ?, ?)\n ON CONFLICT(agent_id) DO UPDATE SET\n task_id = excluded.task_id,\n last_sequence = CASE\n WHEN task_agent_session.last_sequence IS NULL OR task_agent_session.last_sequence < excluded.last_sequence\n THEN excluded.last_sequence\n ELSE task_agent_session.last_sequence\n END,\n updated_at = excluded.updated_at\n ");return{saveMessage:e=>{const n=e.eventId??shared.createEventId(),o=(new Date).toISOString();s.run({eventId:n,taskId:a,senderType:e.senderType,senderId:e.senderId,senderName:e.senderName,message:JSON.stringify(e.message),createdAt:o});const r=i.get(n),c=r?.local_sequence??null;return null!==c&&t.emit("message-saved",{eventId:n}),{eventId:n,localSequence:c}},saveTaskEvent:e=>{const a=e.eventId??shared.createEventId(),n=(new Date).toISOString(),t={...e.eventData,eventId:a};return o.run({eventId:a,taskId:e.taskId,chatId:e.chatId,sequence:e.sequence,eventType:e.eventType,eventData:JSON.stringify(t),createdAt:n}),a},updateTaskEventSequence:(e,a)=>{r.run(a,e,a)},pageTaskEventsAfter:(e,a)=>{const n=c.all(e,a).map(parseTaskEventRow),t=n.at(-1)?.sequence??null;return{data:n,hasMore:null!==t&&Boolean(p.get(t))}},getLatestTaskEvent:e=>{if(0===e.length)return null;const a=e.map(()=>"?").join(","),t=n.prepare(`\n SELECT * FROM task_event\n WHERE event_type IN (${a})\n ORDER BY created_at DESC, rowid DESC\n LIMIT 1\n `).get(...e);return t?parseTaskEventRow(t):null},pageRecentMessages:e=>{const a=l.all(e).map(parseTaskMessageRow).reverse(),n=a[0]?.localSequence??null;return{data:a,hasMore:!!n&&Boolean(m.get(n))}},pageMessagesAfter:(e,a)=>{const n=d.all(e,a).map(parseTaskMessageRow),t=n.at(-1)?.localSequence??null;return{data:n,hasMore:!!t&&Boolean(g.get(t))}},pageMessagesBefore:(e,a)=>{const n=u.all(e,a).map(parseTaskMessageRow).reverse(),t=n[0]?.localSequence??null;return{data:n,hasMore:!!t&&Boolean(m.get(t))}},pageRecentMessagesAfter:(e,a)=>{const n=h.all(e,a).map(parseTaskMessageRow).reverse(),t=n[0]?.localSequence??null;return{data:n,hasMore:!!t&&Boolean(m.get(t))}},getAgentSessions:()=>{const e=f.all(),a=new Map;for(const n of e)a.set(n.agent_id,n.session_id);return a},getAgentLastSequences:()=>{const e=f.all(),a=new Map;for(const n of e)a.set(n.agent_id,n.last_sequence);return a},upsertAgentSession:(e,n)=>{x.run(e,a,n,(new Date).toISOString())},updateAgentLastSequence:(e,n)=>{v.run(e,a,n,(new Date).toISOString())},on:(e,a)=>{t.on(e,a)},off:(e,a)=>{t.off(e,a)},close:()=>{t.removeAllListeners(),n.close()}}}function migrateSchema(e){const a=resolveMigrationsDir(),n=e.pragma("user_version",{simple:!0}),t=loadMigrationSql(a,MIGRATIONS[0].fileName);e.exec(t),n<MIGRATIONS[0].version&&e.pragma(`user_version = ${MIGRATIONS[0].version}`)}function resolveMigrationsDir(){const e=path.dirname(url.fileURLToPath("undefined"==typeof document?require("url").pathToFileURL(__filename).href:_documentCurrentScript&&"SCRIPT"===_documentCurrentScript.tagName.toUpperCase()&&_documentCurrentScript.src||new URL("index.cjs",document.baseURI).href)),a=[path.join(e,"migrations"),path.join(process.cwd(),"dist","migrations"),path.join(process.cwd(),"src","worker","history","migrations")];for(const e of a)if(fs.existsSync(e))return e;throw new Error(`Task history migrations directory not found at ${a[0]}`)}function loadMigrationSql(e,a){const n=path.join(e,a);return fs.readFileSync(n,"utf8")}function parseTaskMessageRow(e){const a=JSON.parse(e.message);return{localSequence:e.local_sequence,eventId:e.event_id,senderType:e.sender_type,senderId:e.sender_id,senderName:e.sender_name,message:a,createdAt:e.created_at}}function parseTaskEventRow(e){const a=JSON.parse(e.event_data);return{eventId:e.event_id,taskId:e.task_id,chatId:e.chat_id,sequence:e.sequence??null,eventType:e.event_type,eventData:a,createdAt:e.created_at}}class TaskWorkerManager{pidToTrackedSession;pidToAwaiter;sandboxPool;constructor(e){this.pidToTrackedSession=new Map,this.pidToAwaiter=new Map,this.sandboxPool=e||null}getCurrentSessions(){return Array.from(this.pidToTrackedSession.values())}getSessionByPid(e){return this.pidToTrackedSession.get(e)}registerTaskWorker(e,a){const n=a.pid;if(!n)return void _package.logger.warn(`[SESSION] Missing PID for task ${e}`);_package.logger.info(`[SESSION] Registered task ${e}, PID: ${n}`);const t=this.pidToTrackedSession.get(n);if(t&&t.taskId===e){const e=this.pidToAwaiter.get(n);e&&(this.pidToAwaiter.delete(n),e(t))}else if(!t){const a={startedBy:"cli",taskId:e,pid:n};this.pidToTrackedSession.set(n,a)}}async decryptTaskMessage(e){if(!e.dataEncryptionKey)return;const a=await _package.machine.getSecretKey();if(!a)return;const n=shared.decryptWithEphemeralKey(shared.decodeBase64(e.dataEncryptionKey),a);if(!n)return void _package.logger.warn("[SESSION] Failed to decrypt data encryption key");if(e.dataEncryptionKey=shared.encodeBase64(n),"task-message"!==e.event)return;const t=e.eventData;if(!t.encryptedMessage)return;const s=shared.decryptSdkMessage(t.encryptedMessage,n);s?e.eventData={...t,message:s,encryptedMessage:void 0}:_package.logger.warn("[SESSION] Failed to decrypt task message")}persistCreateTaskStart(e){const a=getTaskDb({dataDir:_package.machine.resolveDataDir(e.userId,e.taskId),taskId:e.taskId});try{const n=e.eventData;a.saveTaskEvent({eventType:e.event,eventId:n.eventId,eventData:n,taskId:e.taskId,chatId:e.chatId,sequence:n.sequence??0}),n.message&&a.saveMessage({eventId:n.eventId,message:n.message,senderType:n.senderType,senderId:n.senderId,senderName:n.senderName})}finally{a.close()}}persistResumeTaskStart(e){const a=getTaskDb({dataDir:_package.machine.resolveDataDir(e.userId,e.taskId),taskId:e.taskId}),n=e.eventData.sequence;if(null==n)throw new Error(`Missing resume sequence for task ${e.taskId}`);try{const t=e.eventData;a.saveTaskEvent({eventType:e.event,eventId:t.eventId,eventData:t,taskId:e.taskId,chatId:e.chatId,sequence:n}),t.message&&a.saveMessage({eventId:t.eventId,message:t.message,senderType:t.senderType,senderId:t.senderId,senderName:t.senderName})}finally{a.close()}}trackWorkerProcess(e,a){const n={startedBy:"daemon",pid:a.pid,childProcess:a,taskId:e.taskId};this.pidToTrackedSession.set(a.pid,n),a.on("exit",(n,t)=>{this.pidToTrackedSession.delete(a.pid),this.sandboxPool&&this.sandboxPool.disposeWorkerSandbox(e.taskId)}),a.on("error",n=>{this.pidToTrackedSession.delete(a.pid),this.sandboxPool&&this.sandboxPool.disposeWorkerSandbox(e.taskId)})}async startWorker(e,a){const n={eventId:shared.createEventId(),status:"success",opCode:e.eventId},t=_package.machine.resolveProjectCWD(e.userCwd,e.userId,e.taskId);_package.machine.resolveProjectDir(e.userId,e.taskId),await this.decryptTaskMessage(e),_package.machine.writeTaskInput(e),"create-task"===a?this.persistCreateTaskStart(e):this.persistResumeTaskStart(e);const s=["worker","--type",e.agentType||"claude","--started-by","daemon","--task-id",e.taskId,"--user-id",e.userId,"--idle-timeout","120"];let i;if(this.sandboxPool?.isEnabled())try{if(!await this.sandboxPool.createWorkerSandbox(e.taskId,e.userId,t))throw new Error("Failed to create sandbox instance");const{projectPath:a}=await Promise.resolve().then(function(){return require("./logger-CRZgrMLn.cjs")}).then(function(e){return e.machine$1}),{join:n}=await import("path"),o=["--no-warnings","--no-deprecation",n(a(),"dist","index.mjs"),...s],r=`"${process.execPath}" ${o.map(e=>`"${e}"`).join(" ")}`,c=await this.sandboxPool.wrapWorkerCommand(e.taskId,r);_package.logger.debug(`[SESSION] Sandboxed command for task ${e.taskId}: ${c}`),i=child_process.spawn(c,{shell:!0,cwd:t,detached:!0,stdio:["ignore","pipe","pipe"],env:{...process.env}}),_package.logger.info(`[SESSION] Worker started with sandbox, PID: ${i.pid}`)}catch(a){return _package.logger.error(`[SESSION] Failed to setup sandbox for task ${e.taskId}:`,a),n.status="failed",n.message=`Sandbox setup failed: ${a instanceof Error?a.message:String(a)}`,n}else i=spawnAgentrixCLI(s,{cwd:t,detached:!0,stdio:["ignore","pipe","pipe"],env:{...process.env}}),_package.logger.info(`[SESSION] Worker started without sandbox, PID: ${i.pid}`);if(process.env.DEBUG&&(i.stdout?.on("data",e=>{_package.logger.debug(`[Daemon] worker stdout: ${e.toString()}`)}),i.stderr?.on("data",e=>{_package.logger.debug(`[Daemon] worker stderr: ${e.toString()}`)})),!i.pid)return n.status="failed",n.message="Failed to start worker - no PID",n;_package.logger.info(`[SESSION] Worker started, PID: ${i.pid}`),this.trackWorkerProcess(e,i);const[o,r]=createPromiseWithTimeout({timeoutMs:15e3,onTimeout:()=>(this.pidToAwaiter.delete(i.pid),n.status="failed",n.message=`Worker timeout (PID ${i.pid})`,n)});return this.pidToAwaiter.set(i.pid,()=>{r(n)}),o}stopSession(e){for(const[a,n]of this.pidToTrackedSession.entries())if(n.taskId===e){try{(n.childProcess?n.childProcess:{kill:e=>process.kill(a,e)}).kill("SIGTERM"),_package.logger.info(`[SESSION] Task ${e} stopped`)}catch(a){_package.logger.warn(`[SESSION] Failed to stop task ${e}:`,a)}return this.pidToTrackedSession.delete(a),!0}return _package.logger.warn(`[SESSION] Task ${e} not found`),!1}pruneStaleSessions(){for(const[e,a]of this.pidToTrackedSession.entries())try{process.kill(e,0)}catch(a){this.pidToTrackedSession.delete(e)}}shutdown(){_package.logger.info("[SESSION] Shutting down all sessions");for(const[e,a]of this.pidToTrackedSession.entries())try{"daemon"===a.startedBy&&a.childProcess?a.childProcess.kill("SIGTERM"):process.kill(e,"SIGTERM")}catch(a){_package.logger.warn(`[SESSION] Failed to stop PID ${e}:`,a)}this.pidToTrackedSession.clear(),this.pidToAwaiter.clear()}async startDeploymentWorker(e){const a={eventId:shared.createEventId(),status:"success",opCode:e.eventId};_package.machine.writeTaskInput(e);try{const n=spawnAgentrixCLI(["worker","--type","deployment","--started-by","daemon","--task-id",e.taskId,"--user-id",e.userId,"--idle-timeout","10"],{cwd:process.cwd(),detached:!0,stdio:["ignore","pipe","pipe"],env:{...process.env}});if(process.env.DEBUG&&(n.stdout?.on("data",e=>{_package.logger.debug(`[Deployment] worker stdout: ${e.toString()}`)}),n.stderr?.on("data",e=>{_package.logger.debug(`[Deployment] worker stderr: ${e.toString()}`)})),!n.pid)return a.status="failed",a.message="Failed to start deployment worker - no PID",a;_package.logger.info(`[SESSION] Deployment worker started, PID: ${n.pid}`);const t={taskId:e.taskId,userId:e.userId};return this.trackWorkerProcess(t,n),a}catch(e){return a.status="failed",a.message=`Failed to start deployment worker: ${e instanceof Error?e.message:String(e)}`,a}}}function setupGracefulShutdown(e){const{processType:a,onShutdownRequest:n}=e,t=`[${a.toUpperCase()}]`;let s;const i=new Promise(e=>{s=(a,s)=>{_package.logger.info(`${t} Requesting shutdown (source: ${a}, errorMessage: ${s})`),n&&n(a,s),setTimeout(()=>process.exit(1),1e3),e({source:a,errorMessage:s})}}),o=e=>{process.on(e,()=>{s("os-signal")})};return o("SIGINT"),o("SIGTERM"),process.on("uncaughtException",e=>{_package.logger.info(`${t} FATAL: Uncaught exception`,e),_package.logger.info(`${t} Stack trace: ${e.stack}`),s("exception",e.message)}),process.on("unhandledRejection",e=>{_package.logger.info(`${t} FATAL: Unhandled promise rejection`,e);const a=e instanceof Error?e:new Error(`Unhandled promise rejection: ${e}`);_package.logger.info(`${t} Stack trace: ${a.stack}`),s("exception",a.message)}),process.on("exit",e=>{_package.logger.info(`${t} Process exiting with code: ${e}`)}),{requestShutdown:s,shutdownPromise:i}}class SandboxPool{networkManager=null;workerSandboxes=new Map;settings=null;platform;constructor(){this.platform=platform_js.getPlatform()}async initialize(e){if(this.settings=e,!e.enabled)return _package.logger.info("[SANDBOX] Sandbox disabled via settings"),!1;if(!sandboxRuntime.isSupportedPlatform(this.platform))return _package.logger.warn("[SANDBOX] Platform not supported, sandbox disabled"),!1;try{const a={allowedDomains:[new URL(_package.machine.serverUrl).hostname,...e.network.allowedDomains],deniedDomains:e.network.deniedDomains,allowLocalBinding:!1};return this.networkManager=new sandboxRuntime.NetworkManager,await this.networkManager.initialize(a),_package.logger.info("[SANDBOX] Sandbox pool initialized successfully"),!0}catch(e){throw _package.logger.error("[SANDBOX] Failed to initialize:",e),e}}async createWorkerSandbox(e,a,n){if(!this.networkManager||!this.settings?.enabled)return null;try{const t=_package.machine.resolveUserWorkSpaceDir(a),s=_package.machine.getStatePaths().logsDir,i=this.settings.filesystem||{},o=this.settings.env||{},r={...i,allowWrite:[...i.allowWrite||[],t,n,s]};if("linux"===this.platform&&i.allowRead){const e=path.dirname(process.execPath);r.allowRead=[...i.allowRead,e]}const c={filesystem:r,env:o},p=new sandboxRuntime.SandboxManager(this.networkManager,c);return this.workerSandboxes.set(e,p),_package.logger.info(`[SANDBOX] Created sandbox for task ${e}`),p}catch(a){return _package.logger.error(`[SANDBOX] Failed to create sandbox for task ${e}:`,a),null}}async wrapWorkerCommand(e,a){const n=this.workerSandboxes.get(e);if(!n)throw new Error(`No sandbox found for task ${e}`);const t=await n.wrapWithSandbox(a);return _package.logger.debug(`[SANDBOX] Wrapped command for task ${e}`),t}disposeWorkerSandbox(e){const a=this.workerSandboxes.get(e);a&&(a.dispose(),this.workerSandboxes.delete(e),_package.logger.debug(`[SANDBOX] Disposed sandbox for task ${e}`))}async shutdown(){_package.logger.info("[SANDBOX] Shutting down sandbox pool");for(const[e,a]of this.workerSandboxes.entries())a.dispose(),_package.logger.debug(`[SANDBOX] Disposed sandbox for task ${e}`);this.workerSandboxes.clear(),this.networkManager&&(await this.networkManager.shutdown(),this.networkManager=null,_package.logger.info("[SANDBOX] Network manager shutdown complete"))}isEnabled(){return!0===this.settings?.enabled}}class CompanionScheduler{constructor(e,a){this.client=e,this.machineId=a;const n=_package.machine.agentrixAgentsHomeDir,t=path$1.join(n,"companion","claude");this.stateFilePath=path$1.join(t,"state.json")}timer=null;initialDelay=null;intervalMs=9e5;enabled=!0;heartbeatTaskId=null;companionState=null;stateFilePath;start(){this.loadState(),this.companionState?_package.logger.info(`[COMPANION SCHEDULER] Ready: agent=${this.companionState.agentId}, chatId=${this.companionState.chatId}`):_package.logger.warn("[COMPANION SCHEDULER] No state.json found (companion not registered yet), will keep checking"),_package.logger.info(`[COMPANION SCHEDULER] Starting with interval ${this.intervalMs}ms`),this.initialDelay=setTimeout(()=>{this.initialDelay=null,this.tick(),this.scheduleNext()},6e4)}stop(){this.initialDelay&&(clearTimeout(this.initialDelay),this.initialDelay=null),this.timer&&(clearTimeout(this.timer),this.timer=null),_package.logger.info("[COMPANION SCHEDULER] Stopped")}scheduleNext(){this.timer=setTimeout(()=>{this.tick(),this.scheduleNext()},this.intervalMs)}setHeartbeatTaskId(e){this.heartbeatTaskId=e,this.saveStateField("heartbeatTaskId",e)}clearHeartbeatTaskId(){this.heartbeatTaskId=null,this.saveStateField("heartbeatTaskId",void 0),_package.logger.info("[COMPANION SCHEDULER] Cleared heartbeat task ID")}loadState(){try{if(fs$1.existsSync(this.stateFilePath)){this.companionState=JSON.parse(fs$1.readFileSync(this.stateFilePath,"utf-8"));const e=this.companionState?.heartbeatIntervalMs??9e5;e!==this.intervalMs&&(_package.logger.info(`[COMPANION SCHEDULER] Interval changed: ${this.intervalMs}ms → ${e}ms`),this.intervalMs=e),this.enabled=this.companionState?.heartbeatEnabled??!0,this.heartbeatTaskId=this.companionState?.heartbeatTaskId??null,_package.logger.info(`[COMPANION SCHEDULER] Loaded state: agentId=${this.companionState?.agentId}, chatId=${this.companionState?.chatId??"none"}, enabled=${this.enabled}, interval=${this.intervalMs}ms, taskId=${this.heartbeatTaskId??"none"}`)}}catch(e){_package.logger.warn("[COMPANION SCHEDULER] Failed to load state.json",e)}}saveStateField(e,a){try{let n={};fs$1.existsSync(this.stateFilePath)&&(n=JSON.parse(fs$1.readFileSync(this.stateFilePath,"utf-8"))),void 0===a?delete n[e]:n[e]=a;const t=path$1.dirname(this.stateFilePath);fs$1.existsSync(t)||fs$1.mkdirSync(t,{recursive:!0}),fs$1.writeFileSync(this.stateFilePath,JSON.stringify(n,null,2),"utf-8"),_package.logger.debug(`[COMPANION SCHEDULER] Saved state field: ${e}=${a??"removed"}`)}catch(a){_package.logger.warn(`[COMPANION SCHEDULER] Failed to save state field: ${e}`,a)}}tick(){if(this.loadState(),!this.companionState)return void _package.logger.debug("[COMPANION SCHEDULER] Still no state.json, skipping heartbeat");if(!this.enabled)return void _package.logger.debug("[COMPANION SCHEDULER] Heartbeat disabled, skipping");const e=this.companionState;this.heartbeatTaskId?(_package.logger.debug(`[COMPANION SCHEDULER] Sending heartbeat to existing task ${this.heartbeatTaskId}`),this.client.send("task-message",{eventId:shared.createEventId(),taskId:this.heartbeatTaskId,chatId:e.chatId,from:"machine",message:{type:"companion_heartbeat",timestamp:(new Date).toISOString()},senderType:"system",senderId:"system",senderName:"system"})):(_package.logger.debug("[COMPANION SCHEDULER] Requesting new heartbeat task"),this.client.send("request-companion-heartbeat",{eventId:shared.createEventId(),machineId:e.machineId,agentId:e.agentId,chatId:e.chatId,userId:e.userId,timestamp:(new Date).toISOString()}))}}async function startDaemon(){Object.assign(_package.logger,_package.createLogger({type:"daemon"}));const{requestShutdown:e,shutdownPromise:a}=setupGracefulShutdown({processType:"daemon"});console.log("[DAEMON RUN] Starting daemon process..."),_package.logger.debug("[DAEMON RUN] Environment",getEnvironmentInfo()),await isLatestDaemonRunning()&&(console.log("Daemon already running..."),process.exit(0));let n=await _package.machine.acquireDaemonLock(5,200);for(;!n;)await stopDaemon(),n=await _package.machine.acquireDaemonLock(5,200),n||(_package.logger.debug("[DAEMON RUN] cannot acquire daemon lock..."),process.exit(1));try{startCaffeinate()&&_package.logger.debug("[DAEMON RUN] Sleep prevention enabled");const t=await authAndSetupMachineIfNeeded();_package.logger.debug("[DAEMON RUN] Auth and machine setup complete");const s=new SandboxPool;await s.initialize(_package.machine.getSandboxSettings());const i=new TaskWorkerManager(s),{port:o,stop:r}=await startDaemonControlServer({getChildren:()=>i.getCurrentSessions(),stopSession:e=>i.stopSession(e),requestShutdown:()=>e("agentrix-cli"),registerSession:(e,a)=>i.registerTaskWorker(e,a),machineId:t.machineId});try{await listOpeners(),_package.logger.debug("[DAEMON RUN] Openers detected")}catch(e){_package.logger.warn("[DAEMON RUN] Failed to detect openers",e)}const c={pid:process.pid,port:o,startTime:(new Date).toLocaleString(),cliVersion:_package.packageJson.version,logPath:_package.getLogPath({type:"daemon"})};_package.machine.writeDaemonState(c),_package.logger.debug("[DAEMON RUN] Daemon state written");const p=new MachineClient({machineId:t.machineId,serverUrl:_package.machine.serverUrl.replace(/^http/,"ws"),path:"/v1/ws",auth:shared.machineAuth(t.token,t.machineId),keepAliveConfig:{intervalMs:2e4,event:"machine-alive",payloadGenerator:()=>({eventId:shared.createEventId(),machineId:t.machineId,timestamp:Date.now().toString(),controlPort:o})},healthCheckConfig:{enabled:!0,intervalMs:3e4,timeoutMs:5e3},logger:(e,...a)=>_package.logger.debug(`[DAEMON SOCKET] ${e}`,...a)},i,{requestShutdown:e});await p.connect(),_package.logger.info("[DAEMON RUN] Machine client connected to server");const l=new CompanionScheduler(p.client,t.machineId);l.start(),p.client.onEvent("companion-heartbeat-response",e=>{e?.taskId&&l.setHeartbeatTaskId(e.taskId)});const d=async(e,a)=>{l.stop(),await p.disconnect(),await r(),await s.shutdown(),await cleanupDaemonState(),await stopCaffeinate(),await _package.machine.releaseDaemonLock(n),_package.logger.info("[DAEMON RUN] Cleanup completed, exiting process"),process.exit(0)};_package.logger.info("[DAEMON RUN] Daemon started successfully, waiting for shutdown request");const u=await a;await d(u.source,u.errorMessage)}catch(e){_package.logger.info("[DAEMON RUN][FATAL] Failed somewhere unexpectedly - exiting with code 1",e),process.exit(1)}}const MIME_TYPE_MAP={".jpg":"image/jpeg",".jpeg":"image/jpeg",".png":"image/png",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".svg":"image/svg+xml",".ico":"image/x-icon",".pdf":"application/pdf",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".ppt":"application/vnd.ms-powerpoint",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".txt":"text/plain",".md":"text/markdown",".csv":"text/csv",".json":"application/json",".xml":"application/xml",".html":"text/html",".css":"text/css",".js":"application/javascript",".ts":"application/typescript",".zip":"application/zip",".tar":"application/x-tar",".gz":"application/gzip",".rar":"application/vnd.rar",".mp3":"audio/mpeg",".mp4":"video/mp4",".wav":"audio/wav",".avi":"video/x-msvideo"};function detectMimeType(e){const a=e.toLowerCase();return MIME_TYPE_MAP[a]||"application/octet-stream"}function extractExtension(e){try{const a=new URL(e),n=path$1.extname(a.pathname);if(n)return n;const t=a.searchParams.get("filename")||a.searchParams.get("name")||a.searchParams.get("file");if(t){const e=path$1.extname(t);if(e)return e}return""}catch{return""}}async function downloadFile(e,a,n=!1){try{const t=extractExtension(e)||"";let s;if(n)try{const a=new URL(e).pathname,n=path$1.basename(a);s=n&&path$1.extname(n)?n:`${node_crypto.randomUUID()}${t||".dat"}`}catch{s=`${node_crypto.randomUUID()}${t||".dat"}`}else s=`${node_crypto.randomUUID()}${t||".dat"}`;const i=path$1.join(a,s),o=await fetch(e);if(!o.ok)throw new Error(`Failed to download file: ${o.status} ${o.statusText}`);if(!o.body)throw new Error("Response body is null");const r=o.headers.get("content-type"),c=r?.split(";")[0].trim()||detectMimeType(t),p=o.body,l=fs$1.createWriteStream(i);return await promises.pipeline(p,l),{filePath:i,mimeType:c,filename:s}}catch(a){throw new Error(`Failed to download file from ${e}: ${a instanceof Error?a.message:String(a)}`)}}async function processAttachments(e,a){const{attachmentsDir:n,log:t}=a;if(!Array.isArray(e.message.content))return e;const s=await Promise.all(e.message.content.map(async e=>"image"===e.type&&"url"===e.source?.type&&e.source?.url?processImageBlock(e,t):"document"===e.type&&"url"===e.source?.type&&e.source?.url?processDocumentBlock(e,n,t):e));return{...e,message:{...e.message,content:s}}}async function processImageBlock(e,a){try{a?.("info","IMAGE",`Downloading image from: ${e.source.url}`);const n=await fetch(e.source.url);if(!n.ok)return a?.("error","IMAGE",`Failed to download image: ${n.statusText}`),e;const t=await n.arrayBuffer(),s=Buffer.from(t),i=s.toString("base64");let o=n.headers.get("content-type")||"image/jpeg";if(!o.startsWith("image/")){const a=e.source.url.toLowerCase();o=a.endsWith(".png")?"image/png":a.endsWith(".gif")?"image/gif":a.endsWith(".webp")?"image/webp":"image/jpeg"}return a?.("info","IMAGE",`Image downloaded and converted to base64 (${o}, ${Math.round(s.length/1024)}KB)`),{type:"image",source:{type:"base64",media_type:o,data:i}}}catch(n){return a?.("error","IMAGE",`Error processing image: ${n}`),e}}async function processDocumentBlock(e,a,n){try{const t=e.source.url;n?.("info","DOCUMENT",`Downloading document from: ${t}`);const{filePath:s,mimeType:i,filename:o}=await downloadFile(t,a,!0);return n?.("info","DOCUMENT",`Document downloaded to: ${s}`),{type:"text",text:`Document: ${s}\nTitle: ${e.title||o}\nType: ${i}`}}catch(a){return n?.("error","DOCUMENT",`Error processing document: ${a}`),e}}const system_sender={senderType:"system",senderId:"system",senderName:"system"};function createWorkerEventHandlers(e,a){return{"cancel-task":async a=>{a.taskId===e.taskId&&(_package.logger.info(`[WORKER] Task ${e.taskId} cancelled`),await e.stopTask())},"stop-task":async a=>{a.taskId===e.taskId&&(_package.logger.info(`[WORKER] Task ${e.taskId} stopped: ${a.reason||"no reason"}`),await e.stopTask())},"task-message":async n=>{if(n.taskId!==e.taskId)return;let t=n.message??null;if(!t&&n.encryptedMessage&&e.dataEncryptionKey&&(t=shared.decryptSdkMessage(n.encryptedMessage,e.dataEncryptionKey)??null),!t)return;const s={senderType:n.senderType,senderId:n.senderId,senderName:n.senderName};if(e.attachmentsDir&&shared.isSDKUserMessage(t)&&(t=await processAttachments(t,{attachmentsDir:e.attachmentsDir,log:e.logger})),e.shouldPersistTaskMessage&&!await e.shouldPersistTaskMessage(t,s))return void _package.logger.debug(`[WORKER] Dropping incoming task-message before persistence: eventId=${n.eventId}`);const i={...n,message:t,encryptedMessage:void 0,chatId:n.chatId??e.chatId};a.saveTaskEvent({eventType:"task-message",eventId:n.eventId,eventData:i,taskId:e.taskId,chatId:n.chatId??e.chatId,sequence:n.sequence??null}),a.saveMessage({eventId:n.eventId,message:t,senderType:n.senderType,senderId:n.senderId,senderName:n.senderName}),e.onTaskMessage&&await e.onTaskMessage(t,s)},"task-info-update":async a=>{a.taskId===e.taskId&&e.onTaskInfoUpdate&&await e.onTaskInfoUpdate(a)},"worker-status-request":async a=>{a.taskId===e.taskId&&e.onWorkerStatusRequest&&await e.onWorkerStatusRequest(a)},"sub-task-result-updated":async a=>{a.parentTaskId===e.taskId&&e.onSubTaskResultUpdated&&await e.onSubTaskResultUpdated(a)}}}class WorkerClient{client;context;historyDb;constructor(e,a){const{taskId:n,userId:t,machineId:s,cwd:i,chatId:o,...r}=e,c=i.endsWith("/")?i:`${i}/`;this.client=new SocketClient(r),this.context={taskId:n,chatId:o,userId:t,machineId:s,cwd:c,stopTask:a.stopTask,shouldPersistTaskMessage:a.shouldPersistTaskMessage,onTaskMessage:a.onTaskMessage,onTaskInfoUpdate:a.onTaskInfoUpdate,onWorkerStatusRequest:a.onWorkerStatusRequest,onSubTaskResultUpdated:a.onSubTaskResultUpdated,onGitPush:a.onGitPush,dataEncryptionKey:e.dataEncryptionKey},this.historyDb=a.historyDb,this.initHandlers()}connect(){return new Promise((e,a)=>{const n=setTimeout(()=>{a(new Error("Worker connection timeout after 10 seconds"))},1e4);this.client.onLifecycle("connect",()=>{clearTimeout(n),e()}),this.client.onLifecycle("connect_error",e=>{clearTimeout(n),a(e)}),this.client.connect()})}async disconnect(){this.client.connected&&await this.client.flush(5e3).catch(()=>{}),this.client.disconnect()}sendTaskMessage(e,a,n){const t=shared.createEventId();return this.historyDb.saveMessage({eventId:t,message:a,senderType:e.senderType,senderId:e.senderId,senderName:e.senderName}),this.sendTaskEvent(e,a,n),t}sendWorkerInitializing(){const e={eventId:shared.createEventId(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),cwd:this.context.cwd};this.client.send("worker-initializing",e)}sendWorkerInitialized(){const e={eventId:shared.createEventId(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),cwd:this.context.cwd};this.client.send("worker-initialized",e)}sendWorkerReady(e){const a={eventId:shared.createEventId(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),...void 0!==e&&{duration:e}};this.client.send("worker-ready",a)}sendWorkRunning(e){const a={eventId:shared.createEventId(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),activeAgents:e};this.client.send("worker-running",a)}sendWorkerExit(e){const a={eventId:shared.createEventId(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),reason:e};this.client.send("worker-exit",a)}async sendErrorMessageAndExit(e){this.sendSystemErrorMessage(e),await this.client.flush(2e3),this.sendWorkerExit("error"),await this.disconnect()}sendSystemErrorMessage(e,a){const n={type:"assistant",session_id:"",uuid:crypto.randomUUID(),parent_tool_use_id:null,message:{role:"assistant",content:[{type:"text",text:`System Error\n\n${e}`,metadata:{messageType:"system_error"}}]}};this.sendTaskEvent(system_sender,n,{groupId:a?.groupId})}sendAssistantMessage(e,a){const n={type:"assistant",session_id:"",uuid:crypto.randomUUID(),parent_tool_use_id:null,message:{role:"assistant",content:[{type:"text",text:e}]}};this.sendTaskEvent(system_sender,n,{groupId:a?.groupId})}sendAskUser(e,a,n){return this.sendTaskMessage(e,{type:"ask_user",questions:a},{replaceCwd:!1,groupId:n?.groupId})}sendAskUserResponse(e,a){return this.sendTaskMessage(system_sender,a,{replaceCwd:!1,opCode:e})}sendTaskEvent(e,a,n){const{eventId:t,replaceCwd:s=!0,opCode:i,artifacts:o}=n||{};let r=a;if(s){const e=this.context.cwd,n=e.slice(0,-1);let t=JSON.stringify(a);t=t.replaceAll(e,""),t=t.replaceAll(n,"."),r=JSON.parse(t)}const c=t??shared.createEventId(),p={eventId:c,taskId:this.context.taskId,chatId:this.context.chatId,from:"worker",messageType:r.type,message:r,encryptedMessage:void 0,opCode:i,groupId:n?.groupId,senderType:e.senderType,senderId:e.senderId,senderName:e.senderName,artifacts:o};if(this.historyDb.saveTaskEvent({eventType:"task-message",eventId:c,eventData:p,taskId:this.context.taskId,chatId:this.context.chatId,sequence:"number"==typeof p.sequence?p.sequence:null}),this.context.dataEncryptionKey){const e=shared.encryptSdkMessage(r,this.context.dataEncryptionKey);p.message=void 0,p.encryptedMessage=e}return this.client.send("task-message",p),c}sendUpdateTaskAgentSessionId(e){const a={eventId:shared.createEventId(),taskId:this.context.taskId,agentSessionId:e,cwd:this.context.cwd};this.client.send("update-task-agent-session-id",a)}sendChangeTaskTitle(e){const a={eventId:shared.createEventId(),taskId:this.context.taskId,title:e};this.client.send("change-task-title",a),_package.logger.info(`[AGENT] Title changed to: ${e}`)}sendUpdateAgentInfo(e,a){const n={eventId:shared.createEventId(),taskId:this.context.taskId,agentId:e,...a};this.client.send("update-agent-info",n),_package.logger.info(`[AGENT] Agent info updated: ${JSON.stringify(a)}`)}sendResetTaskSession(){const e={eventId:shared.createEventId(),taskId:this.context.taskId};this.client.send("reset-task-session",e),_package.logger.info(`[AGENT] Session reset requested for task ${this.context.taskId}`)}async sendMergeRequest(e,a){const n={eventId:shared.createEventId(),taskId:this.context.taskId,summary:e,description:a};_package.logger.info(`[MERGE] Sending merge-request event for task ${this.context.taskId}`);const t=await this.client.sendWithAck("merge-request",n);if(!t.success)throw new Error(`Failed to create pull request: ${t.error||"Unknown error"}`);return _package.logger.info(`[MERGE] Pull request created: #${t.data.pullRequestNumber}`),{pullRequestNumber:t.data.pullRequestNumber,pullRequestUrl:t.data.pullRequestUrl}}async sendMergePr(){const e={eventId:shared.createEventId(),taskId:this.context.taskId,mergeMethod:"squash"};return _package.logger.info(`[MERGE-PR] Sending merge-pr event for task ${this.context.taskId}`),await this.client.sendWithAck("merge-pr",e)}associateRepository(e,a,n,t){const s={eventId:shared.createEventId(),taskId:this.context.taskId,gitServerHost:e,owner:a,repo:n,remoteUrl:t};_package.logger.info(`[REPO] Sending repository association request: ${e}/${a}/${n}`),this.client.send("associate-repo",s)}async dispatchTaskMessage(e){await this.context.onTaskMessage(e)}initHandlers(){const e=createWorkerEventHandlers(this.context,this.historyDb);this.client.onEvent("cancel-task",e["cancel-task"]),this.client.onEvent("stop-task",e["stop-task"]),this.client.onEvent("task-message",e["task-message"]),this.client.onEvent("task-info-update",e["task-info-update"]),this.client.onEvent("worker-status-request",e["worker-status-request"]),this.client.onEvent("sub-task-result-updated",e["sub-task-result-updated"]),this.client.onEvent("event-ack",e=>{const a=e.data?.sequence;void 0!==e.opCode&&"number"==typeof a&&this.historyDb.updateTaskEventSequence(e.opCode,a)})}}class AgentContextImpl{logger;socketClient;taskId;userId;chatId;rootTaskId;parentTaskId;workingDirectory;taskAgents;serverUrl;constructor(e){this.logger=e.logger,this.socketClient=e.socketClient,this.taskId=e.taskId,this.userId=e.userId,this.chatId=e.chatId,this.rootTaskId=e.rootTaskId,this.parentTaskId=e.parentTaskId,this.workingDirectory=e.workingDirectory,this.taskAgents=e.taskAgents,this.serverUrl=e.serverUrl}async call(e,a,n){const t=shared.createEventId();try{const s=await this.socketClient.sendWithAck("rpc-call",{eventId:t,taskId:this.taskId,method:e,path:a,query:n?.query,body:n?.body});if(!s.success){const n=s.error||{code:"unknown",message:"Unknown error"};throw new Error(`RPC ${e} ${a} failed: ${n.message} (${n.code})`)}return s.data}catch(n){throw new Error(`RPC ${e} ${a} error: ${n.message}`)}}log(e){this.logger.info(e)}getWorkspace(){return this.workingDirectory}getUserId(){return this.userId}getTaskId(){return this.taskId}getChatId(){return this.chatId}getRootTaskId(){return this.rootTaskId}getParentTaskId(){return this.parentTaskId}getTaskAgents(){return this.taskAgents}async createDraftAgent(e){return this.call("POST","/v1/draft-agent",{body:{...e,userId:this.userId,taskId:this.taskId}})}async updateDraftAgent(e,a){return this.call("PATCH",`/v1/draft-agent/${e}`,{body:a})}async startSubTask(e){return{taskId:(await this.call("POST","/v1/tasks/start",{body:{userId:this.userId,chatId:this.chatId,agentId:e.agentId,message:e.message,parentTaskId:this.taskId,customTitle:e.title}})).taskId}}async startGroupTask(e){return{taskId:(await this.call("POST","/v1/tasks/start",{body:{userId:this.userId,chatId:this.chatId,message:e.message,parentTaskId:this.taskId,customTitle:e.title,todos:e.todos}})).taskId}}async sendMessage(e){await this.call("POST",`/v1/tasks/${e.taskId}/send-message`,{body:{message:e.message,target:e.target,fromTaskId:this.taskId,senderType:"agent",senderId:this.taskId,senderName:"agent"}})}async showModal(e){await this.call("POST",`/v1/tasks/${e.taskId}/show-modal`,{body:{modalName:e.modalName,modalData:e.modalData}})}async getTaskSession(e){return this.call("GET",`/v1/tasks/${e}/session`)}async findSubTaskByAgent(e){const a=await this.call("GET","/v1/tasks/find-by-agent",{query:{parentTaskId:this.taskId,agentId:e}});return a.taskId?{taskId:a.taskId}:null}async listSubTasks(){return(await this.call("GET","/v1/tasks/sub-tasks",{query:{parentTaskId:this.taskId}})).tasks}async listTasks(e){return(await this.call("GET","/v1/tasks/recent",{query:{chatId:this.chatId,...e?.limit&&{limit:e.limit},...e?.status&&{status:e.status}}})).tasks}async uploadFile(e){this.logger.info("[Agent-Context] Uploading file...");const a=await fs__namespace$1.promises.stat(e.path);this.logger.info("[Agent-Context] file stats");const n=a.size,t=e.contentType||mimeTypesExports.lookup(e.name)||"application/octet-stream",s=(await this.call("POST","/v1/files/upload-urls",{body:{count:1}})).files[0],i=s.url;this.logger.info(`[Agent-Context] FileUploadUrl: ${i}`);const o=await fs__namespace$1.promises.readFile(e.path),r=await fetch(i,{method:"PUT",headers:{"Content-Type":t},body:o});if(!r.ok)throw new Error(`Failed to upload file to S3: ${r.status} ${r.statusText}`);let c;return await this.call("POST","/v1/files/confirm-upload",{body:{fileId:s.id,name:e.name,size:n,contentType:t,visibility:e.visibility||"private"}}),c="public"===e.visibility?`${this.serverUrl}/v1/files/public/${s.id}`:i.split("?")[0],{fileId:s.id,name:e.name,size:n,contentType:t,url:c}}}function truncateToLines(e,a){const n=e.split("\n");return n.length<=a?e:n.slice(0,a).join("\n")+"..."}function buildSubTaskResultMessage(e,a){let n=e.resultMessage;if(0===n.result.trim().length&&e.encryptedResultMessage&&a){const t=shared.decryptSdkMessage(e.encryptedResultMessage,a);t&&"result"===t.type&&(n={type:"result",result:"result"in t?t.result:"",is_error:t.is_error})}const t={...e,resultMessage:{...n,result:truncateToLines(n.result,3)}};let s=`<sub-task-result-updated>\n${JSON.stringify(t,null,2)}\n</sub-task-result-updated>`;return s+=n.result.trim().length>0?'\n<system-reminder>The result is already shown to user as a card. Just acknowledge briefly (e.g., "Done!"). Only elaborate if error or needs user action.</system-reminder>':"\n<system-reminder>The sub-task result was empty. You can use reply_to_sub_task to ask it to continue, retry, or resend the result.</system-reminder>",{type:"user",message:{role:"user",content:s}}}function createMessageFilter(){const e=new Set;return{filter(a){const n=a;if(!n.message||!n.message.content||"string"==typeof n.message.content)return a;const t=n.message.content.filter(a=>!("tool_result"===a.type&&e.has(a.tool_use_id)||"user"===n.type&&"tool_result"!==a.type));return 0===t.length?null:(n.message.content=t,n)},clear(){e.clear()}}}function formatHistoryMessage(e){const a=buildHistoryMessageParts(e);return a?{type:"user",message:{role:"user",content:[{type:"text",text:`<msg ${buildAttributes({seq:a.seq.toString(),at:a.at,senderType:a.senderType??void 0,senderId:a.senderId??void 0,senderName:a.senderName??void 0})}>${a.text}</msg>\n`},...a.nonTextBlocks]},parent_tool_use_id:null,session_id:""}:null}function formatHistoryMessageXml(e){const a=buildHistoryMessageParts(e);return a?`<msg ${buildAttributes({seq:a.seq.toString(),at:a.at,senderType:a.senderType??void 0,senderId:a.senderId??void 0,senderName:a.senderName??void 0})}>\n${a.text}\n</msg>`:null}function buildAttributes(e){return Object.entries(e).filter(([,e])=>void 0!==e&&""!==e).map(([e,a])=>`${e}="${escapeXmlAttr(a)}"`).join(" ")}function escapeXmlAttr(e){return e.replaceAll("&","&amp;").replaceAll('"',"&quot;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function formatHistoryXml(e){const a=[];for(const n of e){const e=formatHistoryMessageXml(n);e&&a.push(e)}return a.join("\n")}function formatAskUserMessage(e){return`Ask user: ${e.questions.map((e,a)=>{const n=e.options?.map(e=>e.label).filter(Boolean),t=n&&n.length>0?` options: ${n.join(", ")}`:"";return`Q${a+1}[${e.header}] ${e.question}${t}`}).join(" | ")}`}function formatAskUserResponse(e){return`Ask user response:${e.status?` status=${e.status}`:""}${e.reason?` reason=${e.reason}`:""} answers: ${e.answers?.length?e.answers.join(", "):"no answers"}`}function buildHistoryMessageParts(e){const{text:a,nonTextBlocks:n}=formatMessageParts(e.message);return a?{seq:e.localSequence,at:e.createdAt,senderType:e.senderType,senderId:e.senderId,senderName:e.senderName,text:a,nonTextBlocks:n}:null}function formatMessageParts(e){return shared.isAskUserMessage(e)?{text:formatAskUserMessage(e),nonTextBlocks:[]}:shared.isAskUserResponseMessage(e)?{text:formatAskUserResponse(e),nonTextBlocks:[]}:shared.isSDKMessage(e)?formatSdkMessageParts(e):{text:"",nonTextBlocks:[]}}function formatSdkMessageParts(e){switch(e.type){case"user":case"assistant":return splitContentBlocks(e.message.content);case"result":if("success"===e.subtype)return{text:e.result,nonTextBlocks:[]}}return{text:"",nonTextBlocks:[]}}function splitContentBlocks(e){if("string"==typeof e)return{text:e,nonTextBlocks:[]};if(Array.isArray(e)){const a=[],n=[];for(const t of e)"text"!==t.type||"string"!=typeof t.text?n.push(t):a.push(t.text);return{text:a.join("\n"),nonTextBlocks:n}}return{text:"",nonTextBlocks:[]}}function createAgentrixMcpTools(e){return{createTask:createTaskTool(e),createSoloTask:createSoloTaskTool(e),createGroupTask:createGroupTaskTool(e),replyToSubTask:createReplyToSubTaskTool(e),changeTaskTitle:createChangeTaskTitleTool(e),createPr:createPrTool(e),askUser:createAskUserTool(e),getTaskHistory:createGetTaskHistoryTool(e),getTaskAgents:createGetTaskAgentsTool(e),listSubTask:createListSubTaskTool(e),invoke:createInvokeTool(e),assign:createAssignTool(e),updateAgentInfo:createUpdateAgentInfoTool(e),sendReminder:createSendReminderTool(e),listTasks:createListTasksTool(e),readConversation:createReadConversationTool(e),uploadFile:createUploadFileTool(e)}}function createChangeTaskTitleTool({workClient:e}){return claudeAgentSdk.tool("change_title","Change the session title to better describe what you are working on.\n\n## When to Use\n- Call it at the start of a session to set a descriptive title\n- Call it again when the title becomes outdated or too generic\n\nGood titles help users find conversations later.",{title:zod.z.string().describe("New title for the task")},async a=>(e.sendChangeTaskTitle(a.title),{content:[{type:"text",text:`Task title updated to: ${a.title}`}]}))}function createReplyToSubTaskTool({agentContext:e,log:a}){return claudeAgentSdk.tool("emit_to_task","Send follow-up instructions to a running or failed sub-task.\nUse this when the sub-task needs clarification, hit an error, or the user has new requirements.",{taskId:zod.z.string().describe("Sub-task ID to send follow-up instructions to"),instructions:zod.z.string().describe("Additional instructions for the sub-task")},async n=>{try{return await e.sendMessage({taskId:n.taskId,message:{type:"user",message:{role:"user",content:n.instructions}},target:"agent"}),{content:[{type:"text",text:`Sent follow-up instructions to sub-task ${n.taskId}.`}]}}catch(e){return a("error","TASK",`Failed to send follow-up to sub-task ${n.taskId}:`,e),{content:[{type:"text",text:`Failed to send follow-up to sub-task: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function createGetTaskHistoryTool({historyDb:e}){return claudeAgentSdk.tool("get_task_history","Retrieve earlier task history stored locally for additional context.",{sequence:zod.z.number().int().describe("Return messages before this local sequence (exclusive)."),limit:zod.z.number().int().min(1).max(50).default(20).describe("Maximum number of messages to return.")},async a=>{const n=a.limit??20,t=e.pageMessagesBefore(a.sequence,n);return 0===t.data.length?{content:[{type:"text",text:"No earlier messages found."}]}:{content:[{type:"text",text:formatHistoryXml(t.data)}]}})}function createGetTaskAgentsTool({agentContext:e}){return claudeAgentSdk.tool("get_task_agents","List the agents available for the current task and return taskAgents info.",{},async()=>{const a=e.getTaskAgents();return a.length?{content:[{type:"text",text:JSON.stringify(a,null,2)}]}:{content:[{type:"text",text:"No task agents available."}]}})}function createListSubTaskTool({agentContext:e,log:a}){return claudeAgentSdk.tool("list_sub_task","List direct sub tasks for the current task with taskId, title, and cwd.",{},async()=>{try{const a=await e.listSubTasks();return a.length?{content:[{type:"text",text:JSON.stringify(a,null,2)}]}:{content:[{type:"text",text:"No sub tasks found."}]}}catch(e){return a("error","TASK","Failed to list sub tasks:",e),{content:[{type:"text",text:`Failed to list sub tasks: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function createTaskTool({agentContext:e,agentId:a,log:n}){return claudeAgentSdk.tool("create_task","Delegate a task to an agent for independent execution.\nAlways provide a concise task title in \"title\".\nThe task runs asynchronously - you'll be notified when complete via <sub-task-result-updated> message.\nUse for: multi-step implementations, analysis, code reviews, or any work that takes >30 seconds.\nAfter calling this tool, continue responding to user - don't wait for task completion.",{title:zod.z.string().min(1).max(200).describe("Task title for the agent to use (required)"),instructions:zod.z.string().describe("Detailed instructions for the agent. Be specific about what needs to be done."),briefSummary:zod.z.string().describe('One-line summary shown to user immediately (e.g., "Creating login page")')},async t=>{try{const s=await e.startSubTask({agentId:a,message:{type:"user",message:{role:"user",content:t.instructions}},customTitle:t.title});return n("info","TASK",`Created sub-task ${s.taskId} for agent ${a}`),{content:[{type:"text",text:`🚀 Task created: ${s.taskId}\nSummary: ${t.briefSummary}\n\nYou'll receive a <sub-task-result-updated> notification when the task completes. Continue responding to the user.`}]}}catch(e){return n("error","TASK","Failed to create sub-task:",e),{content:[{type:"text",text:`Failed to create task: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function createSoloTaskTool({agentContext:e,log:a}){return claudeAgentSdk.tool("create_solo_task","Create a single-agent async task in group chat.\n\n## When to Use (sparingly)\n- Long-running background work (>5 minutes)\n- Work that needs separate tracking/progress monitoring\n- Complex multi-step projects with explicit deliverables\n\n## Prefer invoke Instead\nFor most requests, use `invoke` - it's simpler and the agent responds directly in chat.\nOnly use this tool when background tracking is truly needed.\n\nAfter creating: You'll receive <sub-task-result-updated> when task completes.",{title:zod.z.string().min(1).max(200).describe("Task title"),instructions:zod.z.string().describe("Instructions for the owner agent"),briefSummary:zod.z.string().optional().describe("One-line summary shown to user immediately"),agentId:zod.z.string().describe("Target agent ID")},async n=>{try{return{content:[{type:"text",text:`🚀 Task created: ${(await e.startSubTask({agentId:n.agentId,message:{type:"user",message:{role:"user",content:n.instructions}},title:n.title})).taskId}\n${n.briefSummary?`Summary: ${n.briefSummary}\n`:""}\nYou'll receive a <sub-task-result-updated> notification when the task completes. Continue responding to the user.`}]}}catch(e){return a("error","TASK","Create solo task failed:",e),{content:[{type:"text",text:`Create solo task failed: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function createGroupTaskTool({agentContext:e,log:a,agentId:n}){return claudeAgentSdk.tool("create_group_task","Create a multi-agent async task plan in group chat.\n\n## When to Use (sparingly)\n- Long-running background work requiring multiple agents (>5 minutes)\n- Complex multi-step projects with explicit deliverables\n- Work that needs separate tracking/progress monitoring\n\n## Prefer invoke Instead\nFor most requests, use `invoke` - it's simpler and agents respond directly in chat.\nOnly use this tool when background tracking with multiple agents is truly needed.\n\nThe planner becomes the task owner; todos are embedded in the task.\nAfter creating: You'll receive <sub-task-result-updated> when task completes.",{title:zod.z.string().min(1).max(200).describe("Task title"),requirement:zod.z.string().describe("Overall requirement"),briefSummary:zod.z.string().optional().describe("One-line summary shown to user immediately"),todos:zod.z.array(zod.z.object({agentId:zod.z.string().describe("Agent ID responsible for the todo"),title:zod.z.string().min(1).max(200).describe("Todo title"),instructions:zod.z.string().describe("Detailed instructions for this todo")})).min(1).describe("Todo list for agents")},async n=>{try{return{content:[{type:"text",text:`🚀 Task created: ${(await e.startGroupTask({title:n.title,todos:n.todos,message:{type:"user",message:{role:"user",content:n.requirement}}})).taskId}\n${n.briefSummary?`Summary: ${n.briefSummary}\n`:""}\nYou'll receive a <sub-task-result-updated> notification when the task completes. Continue responding to the user.`}]}}catch(e){return a("error","DISPATCH","Dispatch failed:",e),{content:[{type:"text",text:`Dispatch failed: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function createPrTool({workClient:e,log:a,isMergeRequestActive:n,clearMergeRequest:t}){return claudeAgentSdk.tool("create_pr","Create a pull request with generated title and description. Use this tool after code has been pushed.",{title:zod.z.string().describe('PR title in conventional commits format (e.g., "feat: add new feature")'),description:zod.z.string().optional().describe("Detailed PR description explaining the changes")},async s=>{if(!n())return{content:[{type:"text",text:"No merge request in progress."}]};a("info","MERGE",`Creating PR via MCP: ${s.title}`);try{const a=await e.sendMergeRequest(s.title,s.description);return t(),{content:[{type:"text",text:`Pull request created successfully!\nNumber: #${a.pullRequestNumber}\nURL: ${a.pullRequestUrl}`}]}}catch(e){return a("error","MERGE","Failed to create PR:",e),{content:[{type:"text",text:`Failed to create pull request: ${e instanceof Error?e.message:"Unknown error"}`}]}}})}function createAskUserTool({askUser:e,log:a}){return claudeAgentSdk.tool("ask_user",'Ask the user questions when you need clarification or user input. Supports 1-4 questions with 2-4 options each. Use this when you need user decisions or additional information. An "Other" option with free text input is automatically added.',{questions:zod.z.array(zod.z.object({question:zod.z.string().describe("The complete question to ask the user"),header:zod.z.string().max(12).describe("Short label displayed as a chip/tag (max 12 chars)"),multiSelect:zod.z.boolean().describe("Set to true to allow multiple option selections"),options:zod.z.array(zod.z.object({label:zod.z.string().describe("Option label (1-5 words)"),description:zod.z.string().describe("Explanation of what this option means")})).min(2).max(4).describe("Available choices (2-4 options)")})).min(1).max(4).describe("Questions to ask (1-4 questions)")},async n=>{try{const a=n.questions.map(e=>({...e,options:[...e.options,{label:"Other",description:""}]})),t=await e(a);return"answered"!==(t.status??"answered")?{content:[{type:"text",text:"The user did not provide an answer within the expected time. \n<system-reminder>Please abort the session, and decide whether to retry when the user provides a new message later.</system-reminder>"}],isError:!0}:{content:[{type:"text",text:`User answers:\n${t.answers.map(e=>e.startsWith("other:")?`Other: "${e.slice(6)}"`:e).join("\n")}`}]}}catch(e){return a("error","ASK_USER","Failed to get user response:",e),{content:[{type:"text",text:`Failed to get user response: ${e instanceof Error?e.message:"Unknown error"}`}]}}})}function createInvokeTool({invokeAgent:e}){return claudeAgentSdk.tool("invoke",'Let an agent respond to the conversation (talk).\n\n**Use for**: Q&A, explanations, opinions, discussions, debates.\n**Do NOT use for**: Work producing files/code → use assign instead.\n\n**hint parameter**: Optional. Use to reduce agent\'s attention cost or provide meta-context:\n- ✅ Role assignment: hint="You argue FOR REST" (first turn of debate)\n- ✅ Focus guidance: hint="Focus on security aspects"\n- ✅ Long/busy chat: hint="Respond to Alice\'s caching question"\n- ✅ Multi-topic: hint="Re: the API design discussion"\n- ❌ Short, clear context: agent can easily find what to respond to\n\nAgent sees hint (if provided) + conversation history and responds in chat.',{agentId:zod.z.string().describe("Target agent ID"),hint:zod.z.string().optional().describe("Optional context/instruction for the agent")},async a=>(e(a.agentId,a.hint),{content:[{type:"text",text:`Invoked ${a.agentId}. The agent will respond in the chat later.`}]}))}function createUpdateAgentInfoTool({workClient:e,agentId:a,uploadFile:n,log:t}){return claudeAgentSdk.tool("update_agent_info","Update your display name, avatar, and signature in the platform.\nCall this after onboarding when the user has chosen your name and emoji/image.\nThis syncs your identity to the platform so the App displays your chosen name and avatar.\n\nFor avatar: provide a local image file path. The image will be uploaded to the platform.\nFor signature: a short status line or tagline shown under your name.",{displayName:zod.z.string().optional().describe("Your display name"),avatarPath:zod.z.string().optional().describe("Local path to avatar image file (png/jpg/svg)"),signature:zod.z.string().optional().describe("Short status line or tagline shown under your name")},async s=>{let i;if(s.avatarPath)try{i=(await n({name:"avatar.png",path:s.avatarPath,visibility:"public"})).fileId}catch(e){return t("error","TOOL","Avatar upload failed:",e),{content:[{type:"text",text:`Avatar upload failed: ${e}`}],isError:!0}}e.sendUpdateAgentInfo(a,{displayName:s.displayName,avatar:i,signature:s.signature});const o=[];return s.displayName&&o.push(`name → ${s.displayName}`),i&&o.push("avatar → uploaded"),s.signature&&o.push(`signature → ${s.signature}`),{content:[{type:"text",text:`Profile updated: ${o.join(", ")}`}]}})}function createAssignTool({assign:e,log:a}){return claudeAgentSdk.tool("assign","Assign work to an agent (do the work).\n\n**Use for**: Code, files, reports, artifacts (agent produces output).\n**Do NOT use for**: Q&A, explanations → use invoke instead.\n\nProgress streams to chat in real-time.",{agentId:zod.z.string().describe("Target agent ID"),instruction:zod.z.string().describe("Task instruction for the agent"),acknowledgment:zod.z.string().optional().describe('Agent\'s quick reply shown immediately (e.g., "starting now", "On it")')},async a=>(e(a.agentId,a.instruction,a.acknowledgment),{content:[{type:"text",text:`Assigned work to ${a.agentId}.`}]}))}function createListTasksTool({agentContext:e,log:a}){return claudeAgentSdk.tool("list_tasks","List recent tasks in the current chat.\nUse this to review what tasks have been running, completed, or are still active.\nReturns a lightweight summary of each task (id, title, state, agent, duration, timestamps).",{limit:zod.z.number().int().min(1).max(50).default(10).optional().describe("Maximum number of tasks to return (default 10)."),status:zod.z.enum(["all","active","completed"]).default("all").optional().describe("Filter by task status: all, active, or completed.")},async n=>{try{const a=await e.listTasks({limit:n.limit??10,status:n.status??"all"});return a.length?{content:[{type:"text",text:JSON.stringify(a,null,2)}]}:{content:[{type:"text",text:"No tasks found."}]}}catch(e){return a("error","TASK","Failed to list tasks:",e),{content:[{type:"text",text:`Failed to list tasks: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function createReadConversationTool({chatHistoryDb:e}){return claudeAgentSdk.tool("read_conversation","Read recent messages from the main conversation between you and the user. Use this to review what was discussed recently.",{limit:zod.z.number().int().min(1).max(200).default(50).optional().describe("Number of recent messages to return (default 50)."),before:zod.z.number().int().optional().describe("Sequence number — return messages before this sequence for pagination.")},async a=>{if(!e)return{content:[{type:"text",text:"Chat history not available in this mode."}],isError:!0};const n=a.limit??50,t=null!=a.before?e.pageMessagesBefore(a.before,n):e.pageRecentMessages(n);if(0===t.data.length)return{content:[{type:"text",text:"No conversation messages found."}]};let s=formatHistoryXml(t.data);return t.hasMore&&(s+=`\n\nMore messages available. Use before=${Math.min(...t.data.map(e=>e.localSequence))} to load earlier messages.`),{content:[{type:"text",text:s}]}})}function createSendReminderTool({agentContext:e,log:a}){return claudeAgentSdk.tool("send_reminder","Send an internal reminder to your main self (本体) in the primary chat.\nThis is for companion shadow (heartbeat task) use only.\n\nThe reminder is invisible to the user — it only wakes up the main companion worker.\nThe main companion will see the reminder in its conversation context and decide how to act.\n\nKeep content concise (one sentence). For detailed analysis, write to a file and pass filePath.",{content:zod.z.string().describe('Brief reminder message (one sentence, e.g., "Heartbeat architecture discussion pending for 2 days, consider following up")'),filePath:zod.z.string().optional().describe("Path to detailed analysis file in workspace, if any")},async n=>{try{const a=e.getChatId();return await e.sendMessage({taskId:a,message:{type:"companion_reminder",content:n.content,filePath:n.filePath,timestamp:(new Date).toISOString()},target:"agent"}),{content:[{type:"text",text:"Reminder sent to main companion."}]}}catch(e){return a("error","COMPANION","Failed to send reminder:",e),{content:[{type:"text",text:`Failed to send reminder: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function createUploadFileTool({uploadFile:e,log:a}){return claudeAgentSdk.tool("upload_file","Upload a local file to the platform and get a public URL.\nUse this to share images, documents, or other files with the user.\nReturns a public URL that can be embedded in markdown (e.g., ![screenshot](url)).",{filePath:zod.z.string().describe("Absolute path to the local file to upload"),name:zod.z.string().optional().describe("Display name for the file (defaults to filename)")},async n=>{try{const a=require("path"),t=n.name||a.basename(n.filePath);return{content:[{type:"text",text:(await e({name:t,path:n.filePath,visibility:"public"})).url}]}}catch(e){return a("error","TOOL","File upload failed:",e),{content:[{type:"text",text:`File upload failed: ${e}`}],isError:!0}}})}const execFileAsync=node_util.promisify(node_child_process.execFile);async function isGitRepository(e){try{const a=simpleGit(e);return await a.checkIsRepo()}catch{return!1}}async function listWorktrees(e){const a=simpleGit(e),n=(await a.raw(["worktree","list","--porcelain"])).trim().split("\n").filter(Boolean),t=[];let s=null;for(const e of n)if(e.startsWith("worktree "))s&&t.push(s),s={path:e.replace("worktree ","").trim(),branch:null,commit:"",isMain:0===t.length};else if(s)if(e.startsWith("HEAD "))s.commit=e.replace("HEAD ","").trim();else{if(e.startsWith("branch ")){const a=e.replace("branch ","").trim();s.branch=a.replace("refs/heads/","");continue}e.startsWith("detached")&&(s.branch=null)}return s&&t.push(s),t}async function createWorktree(e,a,n,t="HEAD"){const s=path$1.dirname(a);if(fs$1.existsSync(s)||fs$1.mkdirSync(s,{recursive:!0}),fs$1.existsSync(a)&&!isDirectoryEmpty(a))throw new Error(`Worktree directory already exists at ${a}`);const i=simpleGit(e);await i.raw(["worktree","add","-b",n,a,t])}async function removeWorktree(e,a,n=!1){const t=simpleGit(e),s=["worktree","remove"];n&&s.push("--force"),s.push(a),await t.raw(s)}async function setGitConfig(e,a,n){await execFileAsync("git",["config","user.name",a],{cwd:e}),await execFileAsync("git",["config","user.email",n],{cwd:e})}async function gitInit(e){const a=simpleGit(e);await a.init()}async function initialCommit(e){const a=simpleGit(e);await a.add("."),await a.commit("Initial commit",{"--allow-empty":null})}async function gitClone(e,a){const n=path$1.dirname(a);fs$1.existsSync(n)||fs$1.mkdirSync(n,{recursive:!0});const t=simpleGit();await t.clone(e,a)}async function ensureTaskBranch(e,a,n){const t=simpleGit(e);(await t.branchLocal()).all.includes(a)?await t.checkout(a):(n&&await t.checkout(n),await t.checkoutLocalBranch(a))}async function hasLocalBranch(e,a){const n=simpleGit(e);return(await n.branchLocal()).all.includes(a)}async function hasUncommittedChanges(e){const a=simpleGit(e);return!(await a.status()).isClean()}async function gitStash(e,a){const n=simpleGit(e);await n.stash(["push"])}async function getCurrentCommitHash(e){const a=simpleGit(e),n=await a.log({maxCount:1});if(!n.latest)throw new Error("No commits found in repository");return n.latest.hash}async function hasAnyCommits(e){try{const a=simpleGit(e);return null!==(await a.log({maxCount:1})).latest}catch{return!1}}function isDirectoryEmpty(e){if(!fs$1.existsSync(e))return!0;const a=fs$1.readdirSync(e);return 0===a.length||1===a.length&&".git"===a[0]}async function autoCommit(e,a){const n=simpleGit(e);return await n.add("."),await n.commit(a),await getCurrentCommitHash(e)}async function generateDiffPatch(e,a,n){const t=simpleGit(e);return await t.diff([`${a}..${n}`])}async function getDiffStats(e,a,n){const t=simpleGit(e),s=await t.diffSummary([`${a}..${n}`]);return{totalInsertions:s.insertions,totalDeletions:s.deletions,files:s.files.map(e=>({path:e.file,insertions:"insertions"in e?e.insertions:0,deletions:"deletions"in e?e.deletions:0}))}}async function getCurrentBranch(e){const a=simpleGit(e);return(await a.revparse(["--abbrev-ref","HEAD"])).trim()}async function gitPush(e,a,n=!1){const t=simpleGit(e),s=n?["--force"]:[];await t.push("origin",a,s)}async function hasUnpushedCommits(e,a){const n=simpleGit(e);try{return(await n.log([`origin/${a}..HEAD`])).total>0}catch{return!0}}async function updateRemoteUrl(e,a,n){const t=simpleGit(e);await t.remote(["set-url",a,n])}async function getRemoteInfo(e){try{const a=simpleGit(e),n=(await a.getRemotes(!0)).find(e=>"origin"===e.name);if(!n?.refs?.fetch)return null;const t=n.refs.fetch,s=t.match(/^git@([^:]+):(.+)\/(.+?)(?:\.git)?$/);if(s){const[,e,a,n]=s;return{url:t,host:e.split("-")[0],owner:a,repo:n}}const i=t.match(/^https?:\/\/([^/]+)\/(.+)\/(.+?)(?:\.git)?$/);if(i){const[,e,a,n]=i;return{url:t,host:e,owner:a,repo:n}}return null}catch(e){return console.error("[GIT] Failed to get remote info:",e),null}}const DEFAULT_GIT_HTTP_USERNAME="oauth2",ASKPASS_USERNAME_ENV="AGENTRIX_GIT_USERNAME",ASKPASS_PASSWORD_ENV="AGENTRIX_GIT_PASSWORD";function createAskPassScript(){const e=path$1.join(os.tmpdir(),`git-askpass-${node_crypto.randomUUID()}.sh`);return fs$1.writeFileSync(e,`#!/bin/sh\ncase "$1" in\n *Username*|*username*) printf '%s\\n' "\${${ASKPASS_USERNAME_ENV}:-oauth2}" ;;\n *) printf '%s\\n' "\${${ASKPASS_PASSWORD_ENV}:-}" ;;\nesac\n`,{mode:448}),e}function askPassEnv(e,a,n="oauth2"){return{...process.env,GIT_ASKPASS:e,GIT_TERMINAL_PROMPT:"0",[ASKPASS_USERNAME_ENV]:n,[ASKPASS_PASSWORD_ENV]:a}}async function cloneWithAskPass(e,a,n){const t=path$1.dirname(n);fs$1.existsSync(t)||fs$1.mkdirSync(t,{recursive:!0});const s=createAskPassScript();try{await execFileAsync("git",["clone",a,n],{env:askPassEnv(s,e)})}finally{fs$1.unlinkSync(s)}}async function pushWithAskPass(e,a,n,t=!1){const s=createAskPassScript();try{const i=["push","origin",n];t&&i.push("--force"),await execFileAsync("git",i,{cwd:a,env:askPassEnv(s,e)})}finally{fs$1.unlinkSync(s)}}async function fetchWithAskPass(e,a){const n=createAskPassScript();try{await execFileAsync("git",["fetch","origin"],{cwd:a,env:askPassEnv(n,e)})}finally{fs$1.unlinkSync(n)}}async function checkUncommittedChanges(e){return!!await isGitRepository(e)&&await hasUncommittedChanges(e)}async function handleUncommittedChanges(e,a){switch(a){case"Ignore":console.log("[GIT] User chose to ignore uncommitted changes");break;case"Commit":console.log("[GIT] Auto-committing uncommitted changes"),await autoCommit(e,"WIP: Auto-commit before task");break;case"Stash":console.log("[GIT] Stashing uncommitted changes"),await gitStash(e);break;case"Abort":throw new Error("Task aborted by user due to uncommitted changes")}}function buildWorkspaceOptions(e){return{gitUrl:e.gitUrl,baseBranch:e.baseBranch,cwd:e.cwd||"",userCwd:e.userCwd,forceUserCwd:e.forceUserCwd,userId:e.userId,taskId:e.taskId,repositorySourceType:e.repositorySourceType,taskRepositoryId:e.repositoryId,gitServerId:e.gitServerId}}function createTaskBranchName(e){return`agentrix/${e}`}function buildRepositoryInitInput(e,a){return{hook_event_name:"RepositoryInit",workspace_path:e,task_id:a}}async function tryLoadPat(e){if(!e)return null;const a=await _package.machine.getSecretKey();return a?loadPat(e,a):null}async function configureGitIdentity(e,a){const n=loadPatMeta(a);if(!n)return void console.warn("[GIT] No PAT user metadata found, skipping git config");const t=n.username,s=n.email||`${n.username}@gitlab.local`;await setGitConfig(e,t,s),console.log(`[GIT] Set local git config user.name=${t} user.email=${s}`)}async function setupGitRepository(e,a,n,t,s){const i=createTaskBranchName(n),o=await isGitRepository(e);if(!isDirectoryEmpty(e)&&!o)throw new Error(`Directory ${e} exists but is not a git repository`);const r=await tryLoadPat(s);return isDirectoryEmpty(e)?(r?(console.log("[GIT] Using GIT_ASKPASS credential injection for clone"),await cloneWithAskPass(r,a,e),s&&await configureGitIdentity(e,s)):await gitClone(a,e),await ensureTaskBranch(e,i,t),await getCurrentCommitHash(e)):(await updateRemoteUrl(e,"origin",a),r&&(console.log("[GIT] Using GIT_ASKPASS credential injection for fetch"),await fetchWithAskPass(r,e),s&&await configureGitIdentity(e,s)),await ensureTaskBranch(e,i,t),await getCurrentCommitHash(e))}async function pushForTask(e,a,n,t){const s=await tryLoadPat(t);s?await pushWithAskPass(s,e,a,n):await gitPush(e,a,n)}async function initializeGitRepository(e,a,n){await gitInit(e);const t=buildRepositoryInitInput(e,a);return n?.onRepositoryInit&&await n.onRepositoryInit(t),await initialCommit(e),await getCurrentCommitHash(e)}async function tryAssociateRepository(e,a){try{const n=await getRemoteInfo(e);if(!n)return void console.log("[REPO] No origin remote found, skipping repository association");if(!a?.onRepositoryDetected)return;console.log(`[REPO] Detected remote: ${n.host}/${n.owner}/${n.repo}`),a.onRepositoryDetected(n)}catch(e){console.error("[REPO] Failed to send repository association:",e)}}async function setupTmpRepoWorkspace(e,a,n){return{initialCommitHash:await initializeGitRepository(e,a,n)}}async function setupWorktreeWorkspace(e,a,n){const t=e.replace(/^~/,os.homedir());if(!await isGitRepository(t))throw new Error(`Directory ${t} is not a git repository. Worktrees can only be created from existing git repositories.`);if(!await hasAnyCommits(t))throw new Error(`Cannot create worktree: repository at ${t} has no commits. Please create an initial commit first: cd ${t} && git add . && git commit -m 'Initial commit'`);const s=createTaskBranchName(n),i=(await listWorktrees(t)).find(e=>e.path===a);if(i){if(i.branch&&i.branch!==s)throw new Error(`Worktree at ${a} is already attached to branch ${i.branch}. Remove it before retrying: git worktree remove ${a}`);return{initialCommitHash:await getCurrentCommitHash(a)}}const o=simpleGit(t),r=(await o.branchLocal()).all.includes(s);if(fs$1.existsSync(a)&&!isDirectoryEmpty(a))throw new Error(`Worktree directory already exists at ${a}. This may be from a previous task. To clean up: git worktree remove ${a} OR rm -rf ${a}`);try{r?await o.raw(["worktree","add",a,s]):await createWorktree(t,a,s,"HEAD")}catch(e){try{await removeWorktree(t,a,!0)}catch{}throw e}return{initialCommitHash:await getCurrentCommitHash(a)}}function createAutoCommitMessage(e,a){return`Auto-commit: ${e} at ${(new Date).toISOString().replace("T"," ").substring(0,19)} for task ${a}`}async function generateAndSavePatch(e,a,n,t){if(a===n)return;const s=await generateDiffPatch(e,a,n);if(!s.trim())return;const i=path$1.join(t,"patch.diff");return await promises$1.writeFile(i,s),i}async function saveTaskPatchDiff(e,a,n,t,s){return generateAndSavePatch(e,t,s,_package.machine.resolveDataDir(a,n))}async function handleGitState(e,a,n,t,s){if(!await isGitRepository(e))return{currentCommitHash:"",hadUncommittedChanges:!1,hasNewCommits:!1,lastSentCommitHash:void 0,patchPath:"",diffStats:void 0};let i=!1;await hasUncommittedChanges(e)&&(await autoCommit(e,t),i=!0);const o=await getCurrentCommitHash(e),r=s||_package.machine.getWorkspaceState(a,n)?.initialCommitHash;if(!r)throw new Error(`Initial commit hash not found for task ${n}`);const c=await _package.machine.readLastSentCommitHash(a,n),p=o!==(c??r),l=_package.machine.resolveDataDir(a,n);return{currentCommitHash:o,hadUncommittedChanges:i,hasNewCommits:p,lastSentCommitHash:c??void 0,patchPath:await generateAndSavePatch(e,r,o,l),diffStats:await getDiffStats(e,r,o)}}async function handleGitStateOnWorkerStart(e,a,n,t){return handleGitState(e,a,n,createAutoCommitMessage("recover from previous session",n),t)}async function markCommitAsSent(e,a,n){await _package.machine.writeLastSentCommitHash(e,a,n)}function applyTemplateVariables(e,a){return e.replace(/\{\{initialCommitHash\}\}/g,a.initialCommitHash).replace(/\{\{currentCommitHash\}\}/g,a.currentCommitHash).replace(/\{\{branchName\}\}/g,a.branchName)}function applyPRPromptTemplate(e,a){return applyTemplateVariables(e,a)}function buildPRRequestPrompt(e,a){return`Please generate pull request metadata for the changes made in this task.\n\nInitial commit hash: ${e}\n${a?`\n\nAdditional instructions:\n${a}`:""}\n\nProvide a concise title (conventional commits format), a detailed description, and a user-facing summary message.`}function executeCommandStreaming(e,a,n,t=6e4){return new Promise(s=>{const i=`shell_${crypto$1.randomUUID().replace(/-/g,"")}`;n.onOutput({type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:i,name:"shell",input:{command:e}}]},parent_tool_use_id:null,session_id:""});const o=child_process.spawn("/bin/bash",["-c",e],{cwd:a,env:process.env,shell:!1});let r=null,c=!1;t>0&&(r=setTimeout(()=>{c=!0,o.kill("SIGTERM"),setTimeout(()=>{o.killed||o.kill("SIGKILL")},1e3)},t));let p="";o.stdout?.on("data",e=>{p+=e.toString()}),o.stderr?.on("data",e=>{p+=e.toString()}),o.on("close",(e,a)=>{let o,l,d;if(r&&clearTimeout(r),c){o=124,d=!0;const e=`\n[Command timed out after ${t/1e3} seconds]`;l=p?`${p}${e}`:e.trim()}else o=null!==e?e:"SIGTERM"===a?143:1,d=0!==o,l=p||"(no output)";n.onOutput({type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:i,content:l,is_error:d}]},parent_tool_use_id:null,session_id:""}),n.onComplete(o),s(o)}),o.on("error",e=>{r&&clearTimeout(r);const a=`[Error] ${e.message||"Command execution failed"}`;n.onOutput({type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:i,content:a,is_error:!0}]},parent_tool_use_id:null,session_id:""}),n.onComplete(1),s(1)})})}class Coordinator{config;messageQueue=[];agentMessageQueue=[];agentMessageResolver=null;workerState="running";messageIdCounter=0;isStopped=!1;runStartTime=Date.now();commandRunning=!1;isDebouncing=!1;agentRunningMap=new Map;backgroundTaskMap=new Map;anonymousBackgroundTaskCount=0;lastActiveAgentsSignature=null;idleTimeoutHandle=null;idleTimeoutMs;constructor(e){this.config=e,this.idleTimeoutMs=Math.max(0,e.idleTimeoutMs??0)}parseMessage(e){if("user"!==e.type)return{type:"normal",content:"",originalMessage:e};const a=("string"==typeof e.message.content?e.message.content:"").trim();return a.startsWith("!")&&!a.startsWith("![")?{type:"bash-command",content:a.slice(1).trim(),originalMessage:e}:"![merge-request]"===a?{type:"merge-request",content:a,originalMessage:e}:"![merge-pr]"===a?{type:"merge-pr",content:a,originalMessage:e}:"![new]"===a?{type:"new-session",content:a,originalMessage:e}:{type:"normal",content:a,originalMessage:e}}async enqueue(e){if(this.isStopped)return void this.log("warn","COORDINATOR","Ignoring message - coordinator is stopped");if(!("user"!==e.type||e.message&&"object"==typeof e.message&&"content"in e.message))return void this.log("warn","COORDINATOR","Ignoring malformed user message (missing content)");const a=this.parseMessage(e),n={id:"msg-"+ ++this.messageIdCounter,type:a.type,priority:"normal",content:a.content,originalMessage:e,timestamp:Date.now()};this.messageQueue.push(n),this.log("info","COORDINATOR",`Enqueued message ${n.id} (type: ${n.type}, queue: ${this.messageQueue.length})`),this.tryUpdateWorkerState(),this.tryProcessNext()}async tryProcessNext(){if(!this.isStopped&&0!==this.messageQueue.length){this.tryUpdateWorkerState();try{const e=this.messageQueue.shift();this.log("info","COORDINATOR",`Processing message ${e.id} (type: ${e.type})`),await this.processMessage(e),this.log("info","COORDINATOR",`Completed message ${e.id}`)}catch(e){this.log("error","COORDINATOR",`Error processing message: ${e}`)}finally{this.isStopped||this.tryProcessNext()}}}async processMessage(e){try{switch(e.type){case"normal":await this.processNormalMessage(e);break;case"bash-command":await this.processBashCommand(e);break;case"merge-request":await this.processMergeRequest(e);break;case"merge-pr":await this.processMergePr(e);break;case"new-session":await this.processNewSession(e);break;default:this.log("warn","COORDINATOR",`Unknown message type: ${e.type}`)}}finally{if("normal"!==e.type){const a=e.originalMessage.__localSequence;void 0!==a&&this.config.onCommandMessageProcessed?.(a)}}}async processNormalMessage(e){this.log("info","COORDINATOR","Processing normal message for SDK");const a=await this.config.handlers.onNormalMessage(e.originalMessage);this.enqueueAgentMessage(a)}async processBashCommand(e){this.log("info","COORDINATOR",`Processing bash command: ${e.content}`),await this.waitWorkerIdle(),this.setCommandRunning(!0);try{await this.config.handlers.onBashCommand(e.content,e.originalMessage)}finally{this.setCommandRunning(!1)}}async processMergeRequest(e){this.log("info","COORDINATOR","Processing merge-request command"),await this.waitWorkerIdle(),this.setCommandRunning(!0);try{await this.config.handlers.onMergeRequest(e.originalMessage)}finally{this.setCommandRunning(!1)}}async processMergePr(e){this.log("info","COORDINATOR","Processing merge-pr command"),await this.waitWorkerIdle(),this.setCommandRunning(!0);try{await this.config.handlers.onMergePr()}finally{this.setCommandRunning(!1)}}async processNewSession(e){this.log("info","COORDINATOR","Processing new-session command"),await this.waitWorkerIdle(),this.setCommandRunning(!0);try{await(this.config.handlers.onNewSession?.())}finally{this.setCommandRunning(!1)}}async waitWorkerIdle(){for(;"idle"!==this.getExecutionState();){if(this.isStopped)throw new Error("Coordinator stopped while waiting for idle");this.log("debug","COORDINATOR","Waiting for worker idle state"),await new Promise(e=>setTimeout(e,100))}}setWorkerState(e){if(this.workerState===e)return;const a=this.workerState;if(this.log("info","COORDINATOR",`Worker state: ${a} → ${e}`),this.workerState=e,"running"===e&&"idle"===a&&(this.runStartTime=Date.now(),this.config.workClient.sendWorkRunning(this.getActiveAgents()),this.lastActiveAgentsSignature=this.getActiveAgentsSignature(),this.clearIdleTimer()),"idle"===e&&"running"===a){let e;this.runStartTime&&(e=Date.now()-this.runStartTime,this.runStartTime=null),this.config.workClient.sendWorkerReady(e),this.lastActiveAgentsSignature=null,this.startIdleTimer()}}updateAgentRunning(e){this.setAgentRunning("default","Agent",e)}setAgentRunning(e,a,n){const t="running"===this.workerState,s=this.lastActiveAgentsSignature;n?this.agentRunningMap.set(e,{agentId:e,agentName:a,startedAt:Date.now()}):this.agentRunningMap.delete(e);const i=this.getActiveAgentsSignature();this.lastActiveAgentsSignature=i,this.tryUpdateWorkerState(),t&&"running"===this.workerState&&i!==s&&this.config.workClient.sendWorkRunning(this.getActiveAgents())}setBackgroundTaskRunning(e,a){e&&(a?this.backgroundTaskMap.set(e,{taskId:e,startedAt:Date.now()}):!this.backgroundTaskMap.delete(e)&&this.anonymousBackgroundTaskCount>0&&(this.anonymousBackgroundTaskCount-=1,this.log("debug","COORDINATOR",`Background task ${e} completed via anonymous fallback (remaining: ${this.anonymousBackgroundTaskCount})`)),this.tryUpdateWorkerState())}setAnonymousBackgroundTaskRunning(e){e?(this.anonymousBackgroundTaskCount+=1,this.log("debug","COORDINATOR",`Anonymous background task started (count: ${this.anonymousBackgroundTaskCount})`)):this.anonymousBackgroundTaskCount>0&&(this.anonymousBackgroundTaskCount-=1,this.log("debug","COORDINATOR",`Anonymous background task completed (count: ${this.anonymousBackgroundTaskCount})`)),this.tryUpdateWorkerState()}getActiveAgents(){return Array.from(this.agentRunningMap.values()).map(({agentId:e,agentName:a})=>({agentId:e,agentName:a}))}getActiveAgentsSignature(){const e=this.getActiveAgents().slice().sort((e,a)=>e.agentId.localeCompare(a.agentId));return JSON.stringify(e)}enqueueAgentMessage(e){if(this.isStopped)this.log("warn","COORDINATOR","Ignoring agent message - coordinator is stopped");else if(this.agentMessageQueue.push(e),this.agentMessageResolver){const e=this.agentMessageResolver;this.agentMessageResolver=null,e(this.agentMessageQueue.shift())}}hasAgentMessages(){return this.agentMessageQueue.length>0}getAgentQueueLength(){return this.agentMessageQueue.length}async waitForAgentMessage(){return this.isStopped?null:this.agentMessageQueue.length>0?this.agentMessageQueue.shift():new Promise(e=>{this.agentMessageResolver=e})}cancelAgentWait(){if(!this.agentMessageResolver)return;const e=this.agentMessageResolver;this.agentMessageResolver=null,e(null)}setCommandRunning(e){this.commandRunning!==e&&(this.commandRunning=e,this.tryUpdateWorkerState())}hasExecutionWork(){return this.commandRunning||this.agentRunningMap.size>0||this.backgroundTaskMap.size>0||this.anonymousBackgroundTaskCount>0||this.isDebouncing}getExecutionState(){return this.hasExecutionWork()?"running":"idle"}setDebouncing(e){this.isDebouncing!==e&&(this.isDebouncing=e,this.tryUpdateWorkerState())}tryUpdateWorkerState(){if(this.isStopped)return;const e=this.messageQueue.length>0||this.agentMessageQueue.length>0,a=this.hasExecutionWork(),n=!e&&!a;this.setWorkerState(n?"idle":"running")}startIdleTimer(){0!==this.idleTimeoutMs&&(this.idleTimeoutHandle||(this.idleTimeoutHandle=setTimeout(()=>{this.idleTimeoutHandle=null,this.isStopped||(this.log("info","COORDINATOR","Idle timeout reached, stopping task"),this.cancelAgentWait(),this.config.onIdleTimeout?.())},this.idleTimeoutMs)))}clearIdleTimer(){this.idleTimeoutHandle&&(clearTimeout(this.idleTimeoutHandle),this.idleTimeoutHandle=null)}getStatus(){return{state:this.workerState}}isActivelyExecuting(){return this.hasExecutionWork()}stop(){this.log("info","COORDINATOR","Stopping coordinator"),this.isStopped=!0,this.clearIdleTimer(),this.messageQueue=[],this.agentMessageQueue=[],this.backgroundTaskMap.clear(),this.anonymousBackgroundTaskCount=0,this.cancelAgentWait()}log(e,a,n){this.config.logger&&this.config.logger(e,a,n)}}function sendMessage(e,a){const n={type:"assistant",session_id:"",uuid:crypto.randomUUID(),parent_tool_use_id:null,message:{role:"assistant",content:[{type:"text",text:a}]}};e.sendTaskMessage(system_sender,n)}async function executeMergePr(e){const{workingDirectory:a,workClient:n,repositoryId:t,gitServerId:s,logger:i,askUser:o}=e;if(i.info("[MERGE-PR] Executing merge-pr command"),t){try{const e=await getCurrentBranch(a),t=await hasUncommittedChanges(a),r=await hasUnpushedCommits(a,e);if(t||r){const c=await askMergePrAction(t,r,o,i);if("Pause"===c)return void sendMessage(n,"Operation paused. Please handle git state and run merge again.");if(("Push"===c||"PushAndMerge"===c)&&(t&&(i.info("[MERGE-PR] Auto-committing changes"),await autoCommit(a,"Auto-commit before merge")),i.info(`[MERGE-PR] Pushing branch ${e} to remote`),await pushForTask(a,e,!1,s),"Push"===c))return void sendMessage(n,"✅ All changes pushed to remote. You can now review and run merge again if everything looks good.")}const c=await n.sendMergePr();if(c.success)sendMessage(n,`✅ PR merged successfully! Branch ${e} has been merged into the target branch.`);else{let e;switch(c.errorType){case"github_conflict":e="Merge conflict detected. Please resolve conflicts manually on GitHub and try again.";break;case"pr_not_open":e="PR is not open. The PR may have already been merged or closed.";break;case"permission_denied":e="Permission denied. You may not have permission to merge this PR.";break;case"merge_failed":e=`Merge failed: ${c.error||"Unknown error"}`;break;default:e=`Failed to merge PR: ${c.error||"Unknown error"}`}n.sendSystemErrorMessage(e)}}catch(e){i.error("[MERGE-PR] Failed:",e);const a=e instanceof Error?e.message:"Unknown error";n.sendSystemErrorMessage(`Failed to push or merge: ${a}`)}i.info("[MERGE-PR] Worker ready after merge-pr execution")}else n.sendSystemErrorMessage("Cannot merge: task has no git repository configured.")}async function askMergePrAction(e,a,n,t){let s="";s=e&&a?"You have uncommitted changes and unpushed commits. What would you like to do?":e?"You have uncommitted changes. What would you like to do?":"You have unpushed commits. What would you like to do?";const i=[{question:s,header:"Git Status",multiSelect:!1,options:[{label:"Pause",description:"Stop operation, handle git state manually"},{label:"Push",description:"Push changes and review before merging"},{label:"Push and Merge",description:"Push changes and merge PR immediately"}]}];try{const e=(await n(i)).answers[0];return e.startsWith("other:")?(t.info(`[MERGE-PR] User provided custom input: ${e}, defaulting to Pause`),"Pause"):{Pause:"Pause",Push:"Push","Push and Merge":"PushAndMerge"}[e]||"Pause"}catch(e){return t.error("[MERGE-PR] Ask user failed:",e),"Pause"}}function applyTaskInfoUpdate(e,a){const n=e.updates?.repositoryId;return"string"==typeof n&&0!==n.length&&a.repositoryId!==n&&(a.repositoryId=n,_package.machine.writeTaskInput(a),!0)}function normalizeAskUserResponse(e){const a=e.status??"answered";return e.status&&e.reason?e:{...e,status:a,reason:e.reason??("timeout"===a?"timeout":"user")}}function askUserWithTimeout(e,a,n,t={}){const s=n.sendAskUser(e),i=t.timeoutMs??18e5,o=t.onTimeout;return new Promise((e,t)=>{const r=setTimeout(()=>{a.delete(s);const i={type:"ask_user_response",answers:[],status:"timeout",reason:"timeout"};n.sendAskUserResponse(s,i),"abort_task"===o?(n.onTimeoutMessage?.("ask_user timed out. Task cancelled."),n.stopTask?.("ask_user_timeout"),t(new Error("Ask user request timed out"))):e(i)},i);a.set(s,a=>{clearTimeout(r),e(normalizeAskUserResponse(a))})})}function trimIdent(e){const a=e.split("\n");for(;a.length>0&&""===a[0].trim();)a.shift();for(;a.length>0&&""===a[a.length-1].trim();)a.pop();const n=a.reduce((e,a)=>{if(""===a.trim())return e;const n=a.match(/^\s*/)[0].length;return Math.min(e,n)},1/0);return a.map(e=>e.slice(n)).join("\n")}const CHANGE_TITLE_PROMPT=trimIdent("\n ## Title Setting Protocol:\n - MUST set a descriptive title using mcp__agentrix__change_title as your FIRST action when the user makes a request\n - This is mandatory, not optional - do this before any other work\n - Update the title if the conversation direction changes substantially\n"),GROUP_CHAT_MESSAGE_FORMAT=trimIdent('\n ## Input Data Format (Conversation Stream)\n\n Messages come in this XML format. Pay attention to `seq` to understand the order.\n\n <msg seq="N" at="ISO_TIME" senderType="human|agent" senderId="id" senderName="name">\n content\n </msg>\n'),ORCHESTRATION_DECISION_FRAMEWORK=trimIdent('\n ## Orchestration Decision Framework\n\n **Core Principle**: Analyze dependencies FIRST to choose orchestration mode.\n\n **Decision Rule**:\n - **No dependencies** (agents work independently) → Direct execution\n - **Has dependencies** (sequential, turn-taking, coordination) → Plan-Execute-Replan loop\n\n ### Mode 1: Direct Execution (No Dependencies)\n\n When agents can work independently with no coordination:\n - Single agent request\n - Parallel opinions (no need to build on each other)\n - Independent work tasks\n\n **Examples**:\n - "Claude, explain X" → invoke(claude)\n - "What do you both think?" → invoke(claude), invoke(codex)\n - "Claude, write parser. Codex, write formatter." → assign both\n\n ### Mode 2: Plan-Execute-Replan Loop (Has Dependencies)\n\n When work has sequential dependencies or coordination:\n\n **The Loop**:\n 1. **PLAN**: TodoWrite defines structure/order\n 2. **EXECUTE**: invoke/assign first agent\n 3. **WAIT**: Agent responds in next message batch\n 4. **REPLAN**: Update TODO (mark done), identify next\n 5. **REPEAT**: Continue until complete\n\n **Dependency types**:\n - **Sequential**: Agent B needs Agent A\'s output\n - **Turn-taking**: Debate/conversation structure (A→B→A)\n - **Coordination**: Multiple agents with defined roles\n\n **Example - Debate** (turn-taking dependency):\n ```\n User: "4-round debate on REST vs GraphQL"\n\n PLAN (TodoWrite):\n - [ ] Claude: Opening argument FOR REST\n - [ ] Codex: Counter argument FOR GraphQL\n - [ ] Claude: Rebuttal\n - [ ] Codex: Final response\n\n EXECUTE: invoke(claude, hint="You argue FOR REST. Present your opening argument.")\n WAIT: Claude responds with REST argument\n REPLAN: Mark done, next is codex\n EXECUTE: invoke(codex, hint="You argue FOR GraphQL. Counter the REST arguments.")\n WAIT: Codex responds with GraphQL argument\n REPLAN: Mark done, next is claude rebuttal\n EXECUTE: invoke(claude) // No hint needed - role already established from history\n REPEAT...\n ```\n\n **hint usage**: Use hint to reduce agent\'s attention cost or provide meta-context:\n - ✅ Role assignment: first turn of debate (hint="You argue FOR REST")\n - ✅ Focus guidance: (hint="Focus only on performance aspects")\n - ✅ Long/busy chat: help agent locate relevant context (hint="Respond to Alice\'s question about caching")\n - ✅ Multi-topic: clarify which thread to address (hint="Re: the API design discussion")\n - ❌ Short, clear context: agent can easily find what to respond to\n - ❌ Role already established: agent knows their role from recent history\n\n **Why TodoWrite**: Planner is event-driven, can\'t "wait" for responses. TodoWrite provides persistent state across turns.\n\n ### Best Practices\n\n - Match agent to user intent by reviewing capabilities (get_task_agents)\n - Review history (get_task_history) when context is unclear\n\n ### Common Mistakes\n\n - ❌ Invoke just because an agent spoke; only act on unmet user requests\n - ❌ Repeated or cascading invokes on the same request\n - ❌ Invoke multiple agents with dependencies simultaneously\n - ❌ Use TodoWrite for independent requests (over-engineering)\n - ❌ Forget to update TODO after agent responds\n'),GROUP_CHAT_PLANNER_IDENTITY=trimIdent('\n You are Planner, orchestrating a chat group where Users and Agents interact.\n Your goal is to observe the conversation stream, analyze context, and direct appropriate agents via tools.\n\n ## Visibility Rules\n\n - Your text output is NOT shown to users, but IS visible to developers for debugging\n - Keep brief reasoning/analysis in your output to help developers understand your decisions\n - NEVER attempt to answer user questions directly - let agents handle all user interaction\n\n ## Output Format\n\n 1. Brief reasoning (for developer debugging)\n 2. Tool calls if needed\n 3. Final output: ONLY "✅" on a new line (no other text after it)\n'),CHAT_MODE_TASK_DELEGATION=trimIdent("\n # Task Delegation\n\n ## When to Delegate (use create_task)\n\n - Implementation work: writing code, editing files, running tests\n - Investigation: multi-file analysis, tracing bugs, code archaeology\n - Code reviews, audits, or quality scans\n - Producing artifacts: reports, plans, configs\n - Any work where the user is waiting for you to finish before the conversation can continue\n\n ## When to Respond Directly\n\n - Answering questions, explaining concepts\n - Quick file lookups to answer a specific question (1-2 reads is fine)\n - Short code snippets or examples in conversation\n - Discussion, planning, decision-making with the user\n\n ## Your Role in Conversation\n\n The conversation is for **discussion, decisions, and summaries** — not for executing work.\n\n - Discuss approaches, trade-offs, and options with the user\n - Make decisions together (or present recommendations)\n - Summarize task results when they come back\n - Coordinate and plan — then delegate execution to tasks\n\n ## Anti-Patterns (Do NOT do these in conversation)\n\n - ❌ **Code editing**: Don't write/edit code directly in conversation — create a task\n - ❌ **Research rabbit holes**: Don't grep → read → grep → read in conversation — delegate the investigation\n - ❌ **Building artifacts**: Any output that produces files (code, reports, configs) belongs in a task\n - ❌ **Running tests/builds**: Don't run test suites or build commands in conversation — create a task\n\n **Rule of thumb**: If you're about to *change* something or *produce* something, it's a task. If you're about to *answer* something, respond directly.\n\n ## After Delegating\n\n - User sees task creation confirmation immediately\n - Continue responding to user's other questions\n - You'll receive <sub-task-result-updated> when task completes\n - Briefly summarize the result to user — no deep analysis needed\n - Do NOT create duplicate sub-tasks unless explicitly asked\n\n ## Using emit_to_task Effectively\n\n emit_to_task sends follow-up instructions to a running or completed sub-task. Use it for:\n\n - **User adds requirements**: User says \"also add tests\" → emit to the existing task, don't create a new one\n - **Passing decisions**: You discussed options with user, user chose option B → emit the decision to the task\n - **Course correction**: Task went in wrong direction → emit new guidance\n - **Providing context**: Task asks a question → get answer from user → emit answer to task\n - **Retry after failure**: Task failed → emit instructions to retry with fixes\n\n Do NOT use emit_to_task to:\n - Start a completely different task (create a new task instead)\n - Send very long instructions (if the scope changed drastically, create a new task)\n\n ## Task Granularity\n\n - **One task = one coherent unit of work** (e.g., \"implement login page\", \"investigate memory leak\")\n - Don't create a task for a single trivial operation (e.g., \"read one file\")\n - Don't cram unrelated work into one task — split them so they can run in parallel\n - Multiple independent tasks CAN run in parallel\n"),PLANNER_BASE_PROMPT=trimIdent(`\n ${GROUP_CHAT_PLANNER_IDENTITY}\n\n ${GROUP_CHAT_MESSAGE_FORMAT}\n\n ${ORCHESTRATION_DECISION_FRAMEWORK}\n`),GROUP_MEMBER_MESSAGE_FORMAT=trimIdent('\n ## Message Format\n\n Messages in this group chat are formatted as XML:\n\n <msg seq="N" at="ISO_TIME" senderType="human|agent" senderId="id" senderName="name">\n content\n </msg>\n\n You may also receive a `<hint>` block at the start:\n\n <hint>\n context or instruction from the orchestrator\n </hint>\n\n The hint provides context for your response (e.g., debate role, focus area).\n Follow the hint\'s guidance while responding to the conversation.\n\n When responding, just reply naturally - the system will handle formatting.\n');function buildAgentsListPrompt(e){const a=["# Available Agents",""];for(const n of e)n.description?a.push(`- **${n.name}** (${n.id}): ${n.description}`):a.push(`- **${n.name}** (${n.id})`);return a.join("\n")}function buildAgentContextPrompt(e,a){const n=a.find(a=>a.id===e);if(!n)return buildAgentsListPrompt(a);const t=a.filter(a=>a.id!==e),s=["# Group Context","",`You are \`${n.name}\`. `,"You are a member of this group chat."];if(n.description&&s.push(`Your role: ${n.description}`),t.length>0){s.push(""),s.push("## Other Agents in This Group"),s.push("");for(const e of t)e.description?s.push(`- **${e.name}**: ${e.description}`):s.push(`- **${e.name}**`)}return s.push(""),s.push(GROUP_MEMBER_MESSAGE_FORMAT),s.join("\n")}function mergeEnvironment(e){const a={};for(const[n,t]of Object.entries(e))"string"==typeof t&&(a[n]=t);return a}function isTextBlock(e){if("object"!=typeof e||null===e)return!1;const a=e;return"text"===a.type&&"string"==typeof a.text}function normalizeClaudeUserMessage(e){return{type:"user",message:{role:"user",content:e},parent_tool_use_id:null,session_id:""}}function extractUserMessageText(e){const a=e.message?.content;return"string"==typeof a?a:Array.isArray(a)?a.filter(isTextBlock).map(e=>e.text).join("\n").trim():""}function createClaudeAssistantMessage(e){return{type:"assistant",session_id:"",uuid:crypto.randomUUID(),parent_tool_use_id:null,message:{role:"assistant",content:[{type:"text",text:e}]}}}function createSdkResultMessage(e){const a=e.usage.input_tokens-e.usage.cached_input_tokens,n={input_tokens:e.usage.input_tokens,output_tokens:e.usage.output_tokens,cache_creation:{ephemeral_1h_input_tokens:0,ephemeral_5m_input_tokens:0},cache_creation_input_tokens:0,cache_read_input_tokens:e.usage.cached_input_tokens,server_tool_use:{web_fetch_requests:0,web_search_requests:0},service_tier:"standard"};return{type:"result",subtype:"success",duration_ms:0,duration_api_ms:0,is_error:!1,num_turns:e.numTurns,result:e.result??"",stop_reason:null,total_cost_usd:0,usage:n,modelUsage:{[e.model]:{inputTokens:a>0?a:0,outputTokens:e.usage.output_tokens,cacheReadInputTokens:e.usage.cached_input_tokens,cacheCreationInputTokens:0,webSearchRequests:0,costUSD:0,contextWindow:0,maxOutputTokens:0}},permission_denials:[],uuid:crypto.randomUUID(),session_id:e.sessionId}}const HOOK_TIMEOUT_MS=6e4;async function executeHook(e,a,n,t){if(!e)return;const s=e[a];if(!s)return;const i=t||(e=>console.log(e));try{i(`[${a}] Executing hook...`);const e=new AbortController,t=setTimeout(()=>{e.abort()},6e4);try{await s(n,"",{signal:e.signal}),i(`[${a}] Hook executed successfully`)}finally{clearTimeout(t)}}catch(e){console.warn(`[${a}] Hook failed (non-fatal):`,e)}}function buildHooksWithDelegation(e,a){const n={},t=e=>async(a,n,t)=>await e(a,n,t)??{},s=new Set([...Object.keys(e),...a?Object.keys(a):[]]);for(const i of s){const s=[],o=e[i];o&&s.push(t(o));const r=a?.[i];r&&s.push(t(r)),n[i]=[{hooks:s}]}return n}const DEFAULT_SERVER_NAME="agentrix",DEFAULT_SERVER_VERSION="1.0.0",formatToolName=(e,a)=>`mcp__${e}__${a}`;function buildAgentrixMcpServer(e){const{modeConfig:a,tools:n,serverName:t=DEFAULT_SERVER_NAME,serverVersion:s=DEFAULT_SERVER_VERSION}=e,{mode:i,supportChangeTitle:o}=a,r=[];switch(i){case"work":o&&r.push(n.changeTaskTitle),r.push(n.createPr),r.push(n.askUser),r.push(n.getTaskHistory);break;case"chat":r.push(n.createTask),r.push(n.replyToSubTask),r.push(n.askUser),r.push(n.getTaskHistory),r.push(n.listSubTask);break;case"group_chat":r.push(n.invoke),r.push(n.createSoloTask),r.push(n.createGroupTask),r.push(n.replyToSubTask),r.push(n.getTaskAgents),r.push(n.getTaskHistory);break;case"group_work":r.push(n.invoke),r.push(n.assign),o&&r.push(n.changeTaskTitle),r.push(n.createPr),r.push(n.getTaskAgents),r.push(n.getTaskHistory);break;case"reply":r.push(n.getTaskHistory),r.push(n.askUser);break;case"companion_chat":r.push(n.createTask),r.push(n.askUser),r.push(n.getTaskHistory),r.push(n.uploadFile);break;case"companion_shadow":r.push(n.getTaskHistory),r.push(n.readConversation)}return("companion_chat"===i||"companion_shadow"===i)&&(r.push(n.listTasks),r.push(n.updateAgentInfo),r.push(n.sendReminder)),{server:claudeAgentSdk.createSdkMcpServer({name:t,version:s,tools:r}),toolNames:r.map(e=>formatToolName(t,e.name))}}async function*oneShotPrompt(e){yield e}let claudePathOverrideCache;function resolveBinaryPath(e){const a="win32"===process.platform?"where":"which",n=node_child_process.spawnSync(a,[e],{encoding:"utf-8"});if(0===n.status)return n.stdout.split(/\r?\n/).map(e=>e.trim()).find(e=>e.length>0)}function normalizeClaudePath(e){const a=e.trim();if(a){if(a.includes("/")||a.includes("\\")||a.startsWith(".")){const e=path$1.isAbsolute(a)?a:path$1.resolve(a);return fs$1.existsSync(e)?e:void 0}return resolveBinaryPath(a)}}function resolveClaudePathOverride(){if(void 0!==claudePathOverrideCache)return claudePathOverrideCache??void 0;const e=process.env.AGENTRIX_CLAUDE_PATH?.trim();if(e){const a=normalizeClaudePath(e);if(a)return claudePathOverrideCache=a,a}claudePathOverrideCache=null}const CHAT_TOOLS=["Bash","Glob","Grep","ExitPlanMode","Read","Skill","SlashCommand","EnterPlanMode"],GROUP_REPLY_TOOLS=["Glob","Grep","Read","Skill"],GROUP_CHAT_TOOLS=["Read","Glob","Grep"],GROUP_WORK_TOOLS=["Read","Glob","Grep","TodoWrite"];function buildSdkTools(e){switch(e){case"work":case"companion_shadow":return;case"chat":case"companion_chat":return[...CHAT_TOOLS];case"reply":return[...GROUP_REPLY_TOOLS];case"group_chat":return[...GROUP_CHAT_TOOLS];case"group_work":return[...GROUP_WORK_TOOLS]}}function getModePrompt(e){const{mode:a,supportChangeTitle:n}=e;switch(a){case"work":return n?CHANGE_TITLE_PROMPT:void 0;case"companion_shadow":case"companion_chat":case"reply":case"group_chat":return;case"chat":return CHAT_MODE_TASK_DELEGATION;case"group_work":{const e=[];return n&&e.push(CHANGE_TITLE_PROMPT),e.join("\n\n")}}}function buildSystemPrompt(e){const{agentId:a,modeConfig:n,cwd:t,agentConfig:s}=e,{mode:i,groupAgents:o}=n,r=s.customSystemPrompt,c=s.systemPromptMode??"append",p=getModePrompt(n);if("group_chat"===i||"group_work"===i){const e=[PLANNER_BASE_PROMPT];return o&&o.length>0&&e.push(buildAgentsListPrompt(o)),p&&e.push(p),e.join("\n\n")}const l="reply"===i&&o&&o.length>0?buildAgentContextPrompt(a,o):void 0,d={};process.env.AGENTRIX_COMPANION_WORKSPACE&&(d.COMPANION_WORKSPACE=process.env.AGENTRIX_COMPANION_WORKSPACE,d.COMPANION_MODE="companion_shadow"===i?"shadow":"chat");const u=Object.keys(d).length>0?d:void 0,m=r?shared.replacePromptPlaceholders(r,t,u):void 0;if("replace"===c&&m){const e=[m];return l&&e.push(l),p&&e.push(p),e.join("\n\n")}const g=[];return l&&g.push(l),p&&g.push(p),m&&g.push(m),{type:"preset",preset:"claude_code",append:g.length>0?g.join("\n\n"):void 0}}function buildQueryOptions(e,a,n,t,s,i,o){const r=buildSystemPrompt({agentId:e,modeConfig:a.modeConfig,cwd:a.cwd,agentConfig:n}),c=buildSdkTools(a.modeConfig.mode),p=buildHooksWithDelegation(a.hooks??{},t),l=resolveClaudePathOverride(),d=i?buildAgentrixMcpServer({modeConfig:a.modeConfig,tools:i}):void 0,u={...d?.server?{agentrix:d.server}:{},...a.mcpServers??{},...s??{}};return{stderr:a.stderr,model:n.customModel||a.model,fallbackModel:n.customFallbackModel,cwd:a.cwd,resume:a.agentSessionId,permissionMode:n.customPermissionMode||"bypassPermissions",settingSources:["user","project","local"],systemPrompt:r,tools:c,mcpServers:u,plugins:n.customPlugins,abortController:a.abortController,env:a.env?mergeEnvironment(a.env):void 0,pathToClaudeCodeExecutable:l,maxTurns:n.customMaxTurns??a.maxTurns??o,extraArgs:n.customExtraArgs,canUseTool:a.canUseTool,hooks:p,outputFormat:a.structuredOutputSchema}}class ClaudeRunner{constructor(e,a,n,t){this.agentId=e,this.agentConfig=a,this.agentHooks=n,this.agentMcpServers=t}getAgentConfiguration(){return this.agentConfig}getHooks(){return this.agentHooks}getMcpServers(){return this.agentMcpServers}async executeHook(e,a,n){await executeHook(this.agentHooks,e,a,n)}async run(e,a){const n=this.agentConfig,t="string"==typeof e?normalizeClaudeUserMessage(e):e;let s=null;const i=claudeAgentSdk.query({prompt:oneShotPrompt(t),options:buildQueryOptions(this.agentId,a,n,this.agentHooks,this.agentMcpServers,a.agentrixTools)});for await(const e of i)if(console.log("ClaudeRunner.run: received message",JSON.stringify(e)),"result"===e.type){s=e;break}if(!s)throw new Error("ClaudeRunner.run: missing result message");return s}async*runStreamed(e,a){const n=this.agentConfig,t="string"==typeof e?normalizeClaudeUserMessage(e):e,s=claudeAgentSdk.query({prompt:oneShotPrompt(t),options:buildQueryOptions(this.agentId,a,n,this.agentHooks,this.agentMcpServers,a.agentrixTools)});for await(const e of s)if(yield e,"result"===e.type)break}loop(e){const a=e.abortController,n=this.agentConfig,t=buildQueryOptions(this.agentId,e,n,this.agentHooks,this.agentMcpServers,e.agentrixTools);let s=!1;const i=[];let o=null;const r=()=>{if(!s&&(s=!0,o)){const e=o;o=null,e(null)}},c=async function*(){for(;!s&&!a.signal.aborted;){if(i.length>0){yield i.shift();continue}const e=await new Promise(e=>{o=e});if(!e)break;yield e}},p=async function*(){try{const e=claudeAgentSdk.query({prompt:c(),options:t});for await(const a of e)yield a}finally{r()}}();return a.signal.addEventListener("abort",r,{once:!0}),{push:e=>{if(console.log("ClaudeRunner.loop.push:",JSON.stringify(e,null,2)),s)return;const a="string"==typeof e?normalizeClaudeUserMessage(e):e;if(o){const e=o;return o=null,void e(a)}i.push(a)},events:p}}}function createSyntheticInitMessage(e){return{type:"system",subtype:"init",apiKeySource:"temporary",betas:[],claude_code_version:"codex",cwd:e.cwd,tools:[],mcp_servers:[],model:e.model??"unknown",permissionMode:"default",slash_commands:[],output_style:"codex",skills:[],plugins:[],uuid:node_crypto.randomUUID(),session_id:e.sessionId}}function generateAndMapToolId(e,a){const n=node_crypto.randomUUID();return a.set(e,n),n}function getMappedToolId(e,a){return a.get(e)||e}function convertThreadEventToSDKMessage(e,a){return"thread.started"===e.type||"turn.started"===e.type||"turn.completed"===e.type||"turn.failed"===e.type?null:"item.started"===e.type?convertItemStarted(e.item,a):"item.completed"===e.type?convertItemCompleted(e.item,a):null}function convertItemStarted(e,a){switch(e.type){case"command_execution":return convertCommandExecutionStarted(e,a);case"file_change":return convertFileChangeStarted(e,a);case"mcp_tool_call":return convertMcpToolCallStarted(e,a);case"web_search":return convertWebSearchStarted(e,a);default:return null}}function convertItemCompleted(e,a){switch(e.type){case"agent_message":return convertAgentMessage(e);case"reasoning":default:return null;case"command_execution":return convertCommandExecutionCompleted(e,a);case"file_change":return convertFileChangeCompleted(e,a);case"mcp_tool_call":return convertMcpToolCallCompleted(e,a);case"web_search":return convertWebSearchCompleted(e,a);case"todo_list":return convertTodoList(e);case"error":return convertError(e)}}function convertAgentMessage(e){return{type:"assistant",message:{id:e.id,type:"message",container:null,role:"assistant",content:[{citations:null,type:"text",text:e.text}],model:"",usage:{},stop_reason:null,context_management:null,stop_sequence:null},parent_tool_use_id:null,session_id:"",uuid:node_crypto.randomUUID().toString()}}function convertCommandExecutionStarted(e,a){return{type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:generateAndMapToolId(e.id,a),name:"Bash",input:{command:e.command}}]},parent_tool_use_id:null,session_id:""}}function convertCommandExecutionCompleted(e,a){return{type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:getMappedToolId(e.id,a),content:"failed"===e.status?"Command execution failed":e.aggregated_output||""}]},parent_tool_use_id:null,session_id:""}}function convertFileChangeStarted(e,a){return{type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:generateAndMapToolId(e.id,a),name:"Edit",input:{changes:e.changes.map(e=>({kind:e.kind,path:e.path}))}}]},parent_tool_use_id:null,session_id:""}}function convertFileChangeCompleted(e,a){const n=a.get(e.id),t=n??generateAndMapToolId(e.id,a),s=!n;(e.changes||[]).map(e=>`${e.kind}: ${e.path}`);const i={type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:t,name:"Edit",input:{changes:(e.changes||[]).map(e=>({kind:e.kind,path:e.path}))}}]},parent_tool_use_id:null,session_id:""},o={type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:t,content:"failed"===e.status?"File changes failed":"File changes completed"}]},parent_tool_use_id:null,session_id:""};return s?[i,o]:o}function convertMcpToolCallStarted(e,a){return{type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:generateAndMapToolId(e.id,a),server_name:e.server,name:e.tool,input:e.arguments}]},parent_tool_use_id:null,session_id:""}}function convertMcpToolCallCompleted(e,a){const n=getMappedToolId(e.id,a),t="failed"===e.status&&e.error;return{type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:n,is_error:t,content:t?e.error.message:e.result?.content||""}]},parent_tool_use_id:null,session_id:""}}function convertWebSearchStarted(e,a){return{type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:generateAndMapToolId(e.id,a),name:"web_search",input:{query:e.query}}]},parent_tool_use_id:null,session_id:""}}function convertWebSearchCompleted(e,a){return{type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:getMappedToolId(e.id,a),content:{type:"web_search_result",results:[]}}]},parent_tool_use_id:null,session_id:""}}function convertTodoList(e){return{type:"assistant",message:{role:"assistant",content:`📋 Todo List:\n${e.items.map(e=>`${e.completed?"✓":"○"} ${e.text}`).join("\n")}`},parent_tool_use_id:null,session_id:""}}function convertError(e){return{type:"assistant",message:{role:"assistant",content:`❌ Error: ${e.message}`},parent_tool_use_id:null,session_id:""}}let codexPathOverrideCache;function resolveCodexPathOverride(){if(void 0!==codexPathOverrideCache)return codexPathOverrideCache??void 0;const e=process.env.AGENTRIX_CODEX_PATH?.trim();return e?(codexPathOverrideCache=e,e):0===node_child_process.spawnSync("codex",["--version"],{stdio:"ignore"}).status?(codexPathOverrideCache="codex",codexPathOverrideCache):void(codexPathOverrideCache=null)}class CodexRunner{createCodex(e){const a={},n=resolveCodexPathOverride();return n&&(a.codexPathOverride=n),e.env&&(a.env=mergeEnvironment(e.env)),new codexSdk.Codex(Object.keys(a).length>0?a:void 0)}getAgentConfiguration(){return null}getHooks(){}getMcpServers(){}async executeHook(e,a,n){}async run(e,a){const n=a.abortController,t=this.createCodex(a),s={workingDirectory:a.cwd,model:a.model,sandboxMode:"danger-full-access",approvalPolicy:"never",skipGitRepoCheck:!0},i=a.agentSessionId?t.resumeThread(a.agentSessionId,s):t.startThread(s),o=await i.run("string"==typeof e?e:extractUserMessageText(e),{signal:n.signal,outputSchema:a.structuredOutputSchema?.schema||void 0}),r=i.id??a.agentSessionId??"unknown",c=o.usage??{input_tokens:0,cached_input_tokens:0,output_tokens:0};return createSdkResultMessage({sessionId:r,model:a.model??"unknown",numTurns:1,usage:c,result:o.finalResponse??""})}async*runStreamed(e,a){const n=a.abortController,t=this.createCodex(a),s={workingDirectory:a.cwd,model:a.model,sandboxMode:"danger-full-access",approvalPolicy:"never",skipGitRepoCheck:!0},i=a.agentSessionId?t.resumeThread(a.agentSessionId,s):t.startThread(s),{events:o}=await i.runStreamed("string"==typeof e?e:extractUserMessageText(e),{signal:n.signal,outputSchema:a.structuredOutputSchema?.schema||void 0});let r=a.agentSessionId||"",c="",p={input_tokens:0,cached_input_tokens:0,output_tokens:0};const l=new Map,d={get:e=>l.get(e),set:(e,a)=>{l.set(e,a)}};for await(const e of o){if("thread.started"===e.type&&(r=e.thread_id,yield createSyntheticInitMessage({sessionId:r,cwd:a.cwd,model:a.model})),"turn.completed"===e.type){e.usage&&(p=e.usage);break}if("turn.failed"===e.type)throw new Error(e.error.message);if("error"===e.type)throw new Error(e.message);if("item.completed"===e.type&&"agent_message"===e.item.type&&e.item.text&&(c=e.item.text),"item.started"===e.type||"item.completed"===e.type){const a=convertThreadEventToSDKMessage(e,d);if(!a)continue;const n=Array.isArray(a)?a:[a];for(const e of n)yield e}}const u=createSdkResultMessage({sessionId:r,model:a.model??"unknown",numTurns:1,usage:p,result:c});yield u}loop(e){const a=e.abortController,n=this.createCodex(e),t={workingDirectory:e.cwd,model:e.model,sandboxMode:"danger-full-access",approvalPolicy:"never",skipGitRepoCheck:!0};let s=e.agentSessionId?n.resumeThread(e.agentSessionId,t):n.startThread(t),i=!1;const o=[];let r=null,c=e.agentSessionId??null,p=0;const l=()=>{if(!i&&(i=!0,r)){const e=r;r=null,e(null)}},d=e=>"string"==typeof e?e:extractUserMessageText(e),u=async function*(){try{for(;!i&&!a.signal.aborted;){const n=o.length>0?o.shift():await new Promise(e=>{r=e});if(!n)break;let t="";const l=new Map,u={get:e=>l.get(e),set:(e,a)=>{l.set(e,a)}},{events:m}=await s.runStreamed(d(n),{signal:a.signal,outputSchema:e.structuredOutputSchema?.schema||void 0});for await(const a of m){if(i)break;if("thread.started"!==a.type){if("turn.completed"===a.type){c&&(yield createSdkResultMessage({sessionId:c,model:e.model??"unknown",numTurns:p+1,usage:a.usage??{input_tokens:0,cached_input_tokens:0,output_tokens:0},result:t}));break}if("turn.failed"===a.type)throw new Error(a.error.message);if("error"===a.type)throw new Error(a.message);if("item.started"===a.type||"item.completed"===a.type){"item.completed"===a.type&&"agent_message"===a.item.type&&a.item.text&&(t=a.item.text);const e=convertThreadEventToSDKMessage(a,u);if(!e)continue;const n=Array.isArray(e)?e:[e];for(const e of n)yield e}}else c=a.thread_id,yield createSyntheticInitMessage({sessionId:c,cwd:e.cwd,model:e.model})}p+=1}}finally{l()}}();return a.signal.addEventListener("abort",l,{once:!0}),{push:e=>{if(console.log("CodexRunner.loop.push:",JSON.stringify(e,null,2)),!i){if(r){const a=r;return r=null,void a(e)}o.push(e)}},events:u}}}function log(e,a,n){e&&e(a,"AGENT",n)}function createDefaultClaudeAgentConfiguration(){return{customSystemPrompt:void 0,customModel:void 0,customFallbackModel:void 0,customMaxTurns:void 0,customExtraArgs:void 0,customPermissionMode:void 0,customPlugins:[],systemPromptMode:"append",customPRPromptTemplate:void 0,prPromptMode:"append",customSdkMcpTools:void 0}}async function loadClaudeAgentConfiguration(e){const{agentId:a,agentDir:n,logger:t}=e;if(!a||"default"===a)return createDefaultClaudeAgentConfiguration();try{log(t,"info",`Loading agent: ${a}`);const e=await shared.loadAgentConfig({agentId:a,framework:"claude",agentDir:n});if(!e.claude)return log(t,"warn",`No claude configuration found for agent ${a}`),createDefaultClaudeAgentConfiguration();const s=e.claude,i=s.plugins.map(e=>({type:"local",path:e})),o=n||shared.getAgentContext().resolveAgentDir(a),r=s.config.sdkMcpTools?.map(e=>path$1.join(o,"claude",e)),c={customSystemPrompt:s.systemPrompt,customModel:s.config.model,customFallbackModel:s.config.fallbackModel,customMaxTurns:s.config.maxTurns,customExtraArgs:s.config.extraArgs,customPermissionMode:s.config.settings?.permissionMode,customPlugins:i,systemPromptMode:s.config.systemPrompt?.mode??"append",customPRPromptTemplate:s.prPromptTemplate,prPromptMode:s.config.pullRequestPrompt?.mode??"append",customSdkMcpTools:r};return log(t,"info",`Agent ${a} loaded successfully (${i.length} plugins)`),c}catch{return log(t,"error",`Failed to load agent: ${a}`),createDefaultClaudeAgentConfiguration()}}const VALID_HOOK_NAMES=["PreToolUse","PostToolUse","SessionStart","SessionEnd","UserPromptSubmit","Stop","SubagentStop","PreCompact","Notification","RepositoryInit"];async function loadHooks(e,a){const n=path.join(e,"hooks");if(!fs.existsSync(n))return{};const t=[path.join(n,"dist","index.mjs"),path.join(n,"dist","index.js"),path.join(n,"index.mjs"),path.join(n,"index.js")];let s=null;for(const e of t)if(fs.existsSync(e)){s=e;break}if(!s)return console.warn(`[Hook Loader] Hooks not built: ${n}`),console.warn("[Hook Loader] To build hooks, run:"),console.warn(`[Hook Loader] cd ${n}`),console.warn("[Hook Loader] npm install && npm run build"),console.warn("[Hook Loader] Or place hooks directly in:"),console.warn(`[Hook Loader] ${path.join(n,"index.js")} or ${path.join(n,"index.mjs")}`),{};try{console.log(`[Hook Loader] Loading hooks: ${s}`);const e=`${url.pathToFileURL(s).href}?t=${Date.now()}`,n=await import(e);if("function"==typeof n.default){if(a)return console.log("[Hook Loader] Using factory pattern with AgentrixContext"),extractHooks(n.default(a));console.warn("[Hook Loader] Factory function found but no context provided, skipping factory")}return extractHooks(n)}catch(e){throw console.error(`[Hook Loader] Failed to load hooks from ${s}:`,e),new Error(`Hook loading failed: ${e instanceof Error?e.message:String(e)}`)}}function extractHooks(e){const a={};for(const n of VALID_HOOK_NAMES){const t=e[n];"function"==typeof t&&(a[n]=t,console.log(`[Hook Loader] ✓ Loaded hook: ${n}`))}const n=Object.keys(a).length;return 0===n?console.warn("[Hook Loader] No valid hooks found in module"):console.log(`[Hook Loader] Successfully loaded ${n} hook(s)`),a}async function loadAgentHooks(e,a,n){if(e&&"default"!==e)try{const t=shared.getAgentContext(),s=a||t.resolveAgentDir(e),i=path$1.join(s,"claude");return await loadHooks(i,n)}catch(e){return void console.warn("[AgentRunners] Failed to load hooks:",e)}}async function loadSdkMcpTools(e,a,n){const t={};for(const s of e)try{n&&n("info","MCP",`Loading SDK MCP tools from: ${s}`);const e=await import(s),i=e.default||e;if(!i){n&&n("warn","MCP",`No default export found in ${s}`);continue}const o="function"==typeof i?i(a):i,r=o.name;t[r]=o,n&&n("info","MCP",`Loaded MCP server: ${r}`)}catch(e){n&&n("error","MCP",`Failed to load SDK MCP tools from ${s}: ${e instanceof Error?e.message:String(e)}`)}return t}class AgentRunners{static pool=new Map;static async create(e,a,n){const t=this.pool.get(a);if(t)return t;let s;if("claude"===e){const e=await loadClaudeAgentConfiguration({agentId:a,agentDir:n?.agentDir,logger:n?.logger});let t,i;n?.context&&a&&"default"!==a&&(t=await loadAgentHooks(a,n.agentDir,n.context)),n?.context&&e.customSdkMcpTools&&e.customSdkMcpTools.length>0&&(i=await loadSdkMcpTools(e.customSdkMcpTools,n.context,n.logger)),s=new ClaudeRunner(a,e,t,i)}else s=new CodexRunner;return this.pool.set(a,s),s}static release(e){this.pool.delete(e)}static releaseAll(){this.pool.clear()}}class NodeFileSystemAdapter{constructor(e){this.workingDirectory=e}async listFiles(e=3){const a=[];return this.listFilesRecursively(this.workingDirectory,a,"",e,0),a}async readFile(e){try{const a=path__namespace$1.join(this.workingDirectory,e);return fs__namespace$1.existsSync(a)?fs__namespace$1.readFileSync(a,"utf-8"):null}catch{return null}}async fileExists(e){const a=path__namespace$1.join(this.workingDirectory,e);return fs__namespace$1.existsSync(a)}listFilesRecursively(e,a,n,t,s){if(!(s>t))try{const i=fs__namespace$1.readdirSync(e,{withFileTypes:!0});for(const o of i){const i=n?`${n}/${o.name}`:o.name;o.isDirectory()?shared.IGNORED_DIRECTORIES.includes(o.name)||this.listFilesRecursively(path__namespace$1.join(e,o.name),a,i,t,s+1):o.isFile()&&a.push(i)}}catch(e){}}}async function detectPreviewMetadata(e){const a=new NodeFileSystemAdapter(e);return shared.detectPreview(a)}class Workspace{constructor(e){this.params=e}state=null;async setup(){const{options:e,handlers:a}=this.params,{userId:n,taskId:t,cwd:s}=e;if(!s)throw new Error("[WORKSPACE] Missing cwd for workspace setup");const i=_package.machine.getWorkspaceState(n,t),o=e.repositorySourceType,r={...e,repositorySourceType:o},{initialCommitHash:c,isGitRepository:p}=await this.ensureWorkspace(r,a,i?.initialCommitHash);await _package.machine.writeWorkspaceState(n,t,{initialized:!0,initializedAt:(new Date).toISOString(),cwd:s,repositorySourceType:r.repositorySourceType,userCwd:e.userCwd,forceUserCwd:e.forceUserCwd,gitUrl:e.gitUrl,baseBranch:e.baseBranch,taskRepositoryId:e.taskRepositoryId,initialCommitHash:c});const l=await handleGitStateOnWorkerStart(s,n,t,c);return this.state={cwd:s,initialCommitHash:c,isGitRepository:p,gitStateResult:l},p&&!e.taskRepositoryId&&await tryAssociateRepository(s,a),this.state}getState(){if(!this.state)throw new Error("[WORKSPACE] Workspace not initialized");return this.state}getCwd(){return this.getState().cwd}getInitialCommitHash(){return this.getState().initialCommitHash}getGitStateResult(){return this.getState().gitStateResult}async prepareResultArtifacts(e={}){const{cwd:a,initialCommitHash:n,isGitRepository:t}=this.getState(),{userId:s,taskId:i}=this.params.options;if(!t||!n)return{};if(await hasUncommittedChanges(a))try{const e=createAutoCommitMessage("result update",i);await autoCommit(a,e)}catch(a){e.onCommitError?.(a)}const o=await getCurrentCommitHash(a);try{await saveTaskPatchDiff(a,s,i,n,o)}catch(a){e.onPatchError?.(a)}const r=await getDiffStats(a,n,o);if(0===r.files.length)return{currentCommitHash:o};const c=await detectPreviewMetadata(a),p=await _package.machine.readLastSentCommitHash(s,i);return p&&p===o?{currentCommitHash:o}:{currentCommitHash:o,artifacts:{commitHash:o,stats:r,preview:c}}}async ensureWorkspace(e,a,n){const t=e.repositorySourceType;return"git-server"===t?this.ensureGitServerWorkspace(e,a,n):"directory"===t?this.ensureDirectoryWorkspace(e,a,n):this.ensureTemporaryWorkspace(e,a,n)}async ensureGitServerWorkspace(e,a,n){const{cwd:t,gitUrl:s,taskId:i,baseBranch:o,gitServerId:r}=e;if(!s)throw new Error("[WORKSPACE] gitUrl is required for git-server mode");const c=await isGitRepository(t),p=isDirectoryEmpty(t);if(!c){if(!p)throw new Error(`[WORKSPACE] Directory ${t} exists but is not a git repository.`);const e=await setupGitRepository(t,s,i,o,r)||await getCurrentCommitHash(t);return{initialCommitHash:this.resolveInitialCommitHash(n,e,"none"),isGitRepository:!0}}return await updateRemoteUrl(t,"origin",s),this.tryResolveDirtyRepo(e,a,n)}async ensureDirectoryWorkspace(e,a,n){const{cwd:t,taskId:s,userCwd:i}=e,o=await isGitRepository(t);if(isDirectoryEmpty(t)){if(!i)return{initialCommitHash:"",isGitRepository:!1};const e=i.replace(/^~/,os.homedir());if(isDirectoryEmpty(e))return{initialCommitHash:"",isGitRepository:!1};if(!await isGitRepository(e))return{initialCommitHash:"",isGitRepository:!1};await hasAnyCommits(e)||await initialCommit(e),await setupWorktreeWorkspace(e,t,s)}else if(!o)return{initialCommitHash:"",isGitRepository:!1};return this.tryResolveDirtyRepo(e,a,n)}async ensureTemporaryWorkspace(e,a,n){const{cwd:t,taskId:s}=e;if(!await isGitRepository(t)){await setupTmpRepoWorkspace(t,s,a),await ensureTaskBranch(t,`agentrix/${s}`,e.baseBranch);const i=await getCurrentCommitHash(t);return{initialCommitHash:this.resolveInitialCommitHash(n,i,"none"),isGitRepository:!0}}return this.tryResolveDirtyRepo(e,a,n)}async tryResolveDirtyRepo(e,a,n){if(await checkUncommittedChanges(e.cwd)){const n=a?.onUncommittedChanges?await a.onUncommittedChanges():"Ignore";await handleUncommittedChanges(e.cwd,n)}await hasAnyCommits(e.cwd)||await initialCommit(e.cwd);const t=await this.tryResolveBranchMismatch(e,a),s=await getCurrentCommitHash(e.cwd);return{initialCommitHash:this.resolveInitialCommitHash(n,s,t),isGitRepository:!0}}resolveInitialCommitHash(e,a,n){return e?"kept"===n?a:e:a}async tryResolveBranchMismatch(e,a){const n=`agentrix/${e.taskId}`,t=await getCurrentBranch(e.cwd);if(t===n)return"none";if(!await hasLocalBranch(e.cwd,n))return await ensureTaskBranch(e.cwd,n,e.baseBranch),"switched";const s=a?.onBranchMismatch?await a.onBranchMismatch({currentBranch:t,expectedBranch:n,workingDirectory:e.cwd}):"Switch",i="Keep"===s?"Keep":s;if("Abort"===i)throw new Error("Task aborted by user due to branch mismatch");return"Keep"===i?"kept":(await ensureTaskBranch(e.cwd,n,e.baseBranch),"switched")}}const prInfoSchema=zod.z.object({title:zod.z.string().describe("Concise PR title following conventional commits format (feat/fix/docs/refactor/test/chore: description), maximum 50 characters"),description:zod.z.string().describe("Detailed PR description explaining: what changed, why these changes were necessary, any important technical decisions, and impact on existing functionality"),userMessage:zod.z.string().describe("Friendly message to display to the user, summarizing the PR creation. Should be concise and informative.")}),prInfoJsonSchema=zod.toJSONSchema(prInfoSchema),prInfoOpenAiSchema=zod.toJSONSchema(prInfoSchema);function parsePrInfoFromResult(e){if("success"!==e.subtype)throw new Error("PR response failed before structured output was returned");const a=e;return a.structured_output?prInfoSchema.parse(a.structured_output):parsePrInfo(a.result??"")}function extractJsonCandidate(e){const a=e.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);return a?a[1].trim():e.trim()}function parsePrInfo(e){if(!e.trim())throw new Error("PR response was empty");const a=extractJsonCandidate(e),n=JSON.parse(a);return prInfoSchema.parse(n)}class InProcessQueue{chain=Promise.resolve();run(e){const a=this.chain.then(e,e);return this.chain=a.then(()=>{},()=>{}),a}}class ClaudeWorker{constructor(e,a,n){this.credentials=e,this.options=a,this.workingDirectory=n;const t=this.options.input,{taskId:s,userId:i}=t;this.logger=_package.createLogger({type:"worker",taskId:s}),this.currentAgentSessionId="agentSessionId"in t?t.agentSessionId:void 0;const o=t.taskAgents||[];this.taskAgentsMap=new Map(o.map(e=>[e.id,e]));const r=this.taskAgentsMap.size>1;this.primaryAgentId=r?"planner":t.agentId,this.primaryAgentName=r?"planner":this.taskAgentsMap.get(t.agentId)?.name??"unknown";const c=this.createWorkerClientConfig(i,s,n),p=_package.machine.resolveDataDir(i,s);this.historyDb=getTaskDb({dataDir:p,taskId:s}),this.workClient=new WorkerClient(c.config,{...c.handlers,historyDb:this.historyDb}),this.coordinator=this.createMessageCoordinator(this.workClient,this.options.idleTimeoutSecond),this.agentContext=new AgentContextImpl({logger:this.logger,socketClient:this.workClient.client,taskId:t.taskId,userId:t.userId,chatId:t.chatId,rootTaskId:t.rootTaskId||t.taskId,parentTaskId:t.parentTaskId||null,workingDirectory:this.workingDirectory,taskAgents:t.taskAgents||[],serverUrl:_package.machine.serverUrl}),this.agentrixTools=this.createAgentrixTools();const l={...buildWorkspaceOptions(this.options.input),cwd:this.workingDirectory};this.workspace=new Workspace({options:l,handlers:this.createWorkspaceHandlers(this.workClient)})}abortController=new AbortController;isStopping=!1;askUserAwaiter=new Map;messageFilter=createMessageFilter();logger;workClient;workspace;coordinator;agentContext;runner;agentQueues=new Map;currentAgentSessionId;currentGroupId=null;historyDb;chatHistoryDb=null;agentrixTools;pendingPermissions=new Map;grantedPermissions=new Set;taskAgentsMap;messageSavedListener=null;messageDebounceHandle=null;messageDebounceMs=1e4;lastProcessedSequence=0;primarySessionReady=!1;pendingPrimaryLastSequence=null;primaryAgentId;primaryAgentName;newMessageGroupId(){return`group-${crypto.randomUUID()}`}refreshGroupId(){this.currentGroupId=this.newMessageGroupId()}shouldProcessMessage(e){const a=e.message,n=this.getRunnerMode(),t="group_chat"===n||"group_work"===n,s=shared.isAskUserResponseMessage(a);return!!shared.isCompanionHeartbeatMessage(a)||!!shared.isCompanionReminderMessage(a)||!(!shared.isSDKMessage(a)&&!s)&&(t?e.senderId!==this.primaryAgentId:!!s||"system"===e.senderType&&"user"===a.type||"user"===a.type)}shouldDropHeartbeatWhileBusy(){return this.coordinator.isActivelyExecuting()}async processPendingMessages(){const e=this.historyDb.pageMessagesAfter(this.lastProcessedSequence,100),a=[];for(const n of e.data)this.lastProcessedSequence=n.localSequence,this.shouldProcessMessage(n)&&a.push(n);if(a.length>0){this.deduplicateHeartbeats(a);const e=this.mergeConsecutiveHumanMessages(a),n=this.getRunnerMode();"group_chat"===n||"group_work"===n?await this.processMessagesAsGroup(e):await this.processMessagesIndividually(e)}e.hasMore&&await this.processPendingMessages()}deduplicateHeartbeats(e){let a=-1;for(let n=e.length-1;n>=0;n--)shared.isCompanionHeartbeatMessage(e[n].message)&&(-1===a?a=n:(e.splice(n,1),a--))}mergeConsecutiveHumanMessages(e){if(0===e.length)return[];const a=[];let n=0;for(;n<e.length;){const t=e[n];if("human"===t.senderType){const s=[t];for(;n+1<e.length;){const a=e[n+1];if("human"!==a.senderType||a.senderId!==t.senderId)break;s.push(a),n++}1===s.length?a.push(t):a.push(this.createMergedHumanMessage(s))}else a.push(t);n++}return a}createMergedHumanMessage(e){const a=[],n=[];for(const t of e){const e=t.message;if(!shared.isSDKMessage(e)||"user"!==e.type)continue;const s=e.message.content;if("string"==typeof s)a.push(s);else if(Array.isArray(s))for(const e of s)"text"===e.type?a.push(e.text):n.push(e)}const t=a.join(""),s=n.length>0?[{type:"text",text:t},...n]:t,i=e[0],o=e[e.length-1];return{localSequence:o.localSequence,eventId:o.eventId,senderType:i.senderType,senderId:i.senderId,senderName:i.senderName,createdAt:o.createdAt,message:{type:"user",message:{role:"user",content:s},parent_tool_use_id:null,session_id:i.message?.session_id||""}}}async processMessagesAsGroup(e){const a=[],n=[];for(const t of e){const e=formatHistoryMessage(t);if(e){const t=e.message.content;if("string"==typeof t)a.push(t);else if(Array.isArray(t))for(const e of t)"text"===e.type?a.push(e.text):n.push(e)}}if(0===a.length)return;const t=Math.max(...e.map(e=>e.localSequence)),s=a.join(" "),i={type:"user",message:{role:"user",content:n.length>0?[{type:"text",text:s},...n]:s},parent_tool_use_id:null,session_id:""};i.__localSequence=t,await this.coordinator.enqueue(i)}async processMessagesIndividually(e){for(const a of e){const e=this.formatSingleMessage(a);e&&(e.__localSequence=a.localSequence,await this.coordinator.enqueue(e))}}formatSingleMessage(e){const a=e.message;if(shared.isCompanionHeartbeatMessage(a))return{type:"user",message:{role:"user",content:`[heartbeat] You are being awakened by a scheduled heartbeat at ${a.timestamp}. Check your workspace for any pending tasks, reminders, or scheduled work. If nothing to do, respond briefly and exit.`},parent_tool_use_id:null,session_id:""};if(shared.isCompanionReminderMessage(a)){const e=a;let n=`[reminder from shadow] ${e.content}`;return e.filePath&&(n+=`\nDetailed analysis: ${e.filePath}`),{type:"user",message:{role:"user",content:n},parent_tool_use_id:null,session_id:""}}return shared.isSDKMessage(a)&&"user"===a.type?a:null}setupMessageSavedListener(){this.messageSavedListener=()=>{this.triggerMessageProcessing()},this.historyDb.on("message-saved",this.messageSavedListener)}triggerMessageProcessing(){const e=this.getRunnerMode();"group_chat"===e||"group_work"===e?this.scheduleProcessPendingMessages():this.processPendingMessages()}scheduleProcessPendingMessages(){this.coordinator?.setDebouncing(!0),this.messageDebounceHandle&&clearTimeout(this.messageDebounceHandle),this.messageDebounceHandle=setTimeout(async()=>{this.messageDebounceHandle=null,await this.processPendingMessages(),this.coordinator?.setDebouncing(!1)},this.messageDebounceMs)}async start(){let e="completed";try{await this.initialize(),await this.handleEvent(),await this.runClaude()}catch(a){if(!(a instanceof claudeAgentSdk.AbortError)){e="error",this.log("warn","AGENT","Fatal error:",a);const n=a instanceof Error?a.message:String(a);await this.reportFatalError(n)}}finally{await this.exitWorker(e)}}async initialize(){const e=this.options.input;await this.workClient.connect(),this.workClient.sendWorkerInitializing();const a=await AgentRunners.create("claude",e.agentId,{agentDir:e.agentDir,logger:this.log.bind(this),context:this.agentContext});this.runner=a,await this.workspace.setup(),await this.registerWithDaemon(this.workingDirectory),this.setEnvironmentVariables(),this.lastProcessedSequence=this.historyDb.getAgentLastSequences().get(this.primaryAgentId)??0,this.log("info","HISTORY",`Starting from sequence ${this.lastProcessedSequence} (tracking: ${this.primaryAgentId})`),this.currentAgentSessionId&&(this.historyDb.upsertAgentSession(this.primaryAgentId,this.currentAgentSessionId),this.primarySessionReady=!0),this.setupMessageSavedListener(),this.workClient.sendWorkerInitialized()}createWorkspaceHandlers(e){return{onRepositoryDetected:a=>{e.associateRepository(a.host,a.owner,a.repo,a.url)},onRepositoryInit:async e=>{await(this.runner?.executeHook("RepositoryInit",e))},onUncommittedChanges:this.onUncommittedChanges.bind(this),onBranchMismatch:this.onBranchMismatch.bind(this)}}async registerWithDaemon(e){const a=this.options.input.taskId,n=await notifyDaemonSessionStarted(a,{cwd:e,machineId:this.credentials.machineId,pid:process.pid,startedBy:this.options.startedBy||"terminal"});n.error?this.log("warn","DAEMON",`Failed to report session ${a}:`,n.error):this.log("info","DAEMON",`Session ${a} registered`)}setEnvironmentVariables(){this.options.input.environmentVariables&&Object.entries(this.options.input.environmentVariables).forEach(([e,a])=>{null!=a&&(process.env[e]=String(a))}),this.options.input.api_base_url&&(process.env.ANTHROPIC_BASE_URL=this.options.input.api_base_url),this.options.input.api_key&&(process.env.ANTHROPIC_AUTH_TOKEN=this.options.input.api_key)}createMessageCoordinator(e,a){const n=1e3*Math.max(0,a??0);return this.coordinator=new Coordinator({workerType:"claude",workClient:e,onCommandMessageProcessed:e=>{this.markPrimaryMessageProcessed(e)},handlers:{onNormalMessage:async e=>e,onBashCommand:async(e,a)=>{await this.executeBashCommand(e)},onMergeRequest:async e=>{await this.executeMergeRequest()},onMergePr:async()=>{await this.executeMergePr()},onNewSession:async()=>{await this.executeNewSession()}},logger:(e,a,n)=>{const t=e;this.log(t,a,n)},idleTimeoutMs:n,onIdleTimeout:()=>this.stopTask("idle")}),this.coordinator}handleEvent(){const e=this.options.input.event,a=this.options.input.eventData;if("sub-task-result-updated"===e){const e=a,n=buildSubTaskResultMessage(e,this.options.dataEncryptionKey);this.historyDb.saveMessage({eventId:e.eventId||`sub-task-${Date.now()}`,message:n,senderType:"system",senderId:"system",senderName:"system"})}this.triggerMessageProcessing()}async executeMergeRequest(){this.log("info","MERGE","Executing merge-request command");const e=this.getRunnerMode(),a="group_chat"===e||"group_work"===e;try{if(!this.options.input.repositoryId){const e="Cannot create PR: task has no git repository configured.";return this.log("warn","MERGE","No repositoryId found in task input"),void this.workClient.sendSystemErrorMessage(e,{groupId:this.currentGroupId??void 0})}await hasUncommittedChanges(this.workingDirectory)&&(await autoCommit(this.workingDirectory,"Checkpoint for PR generation"),this.log("info","MERGE","Auto-committed changes"));const e=await getCurrentCommitHash(this.workingDirectory),n=this.workspace.getInitialCommitHash();if(!n){const e="Cannot create PR: initial commit hash is missing.";return this.log("error","MERGE",e),void this.workClient.sendSystemErrorMessage(e,{groupId:this.currentGroupId??void 0})}if(0===(await getDiffStats(this.workingDirectory,n,e)).files.length){const e="No changes to create PR: no files changed since task started";return void this.workClient.sendSystemErrorMessage(e,{groupId:this.currentGroupId??void 0})}const t=await getCurrentBranch(this.workingDirectory);this.log("info","MERGE",`Pushing branch ${t} to remote`),await pushForTask(this.workingDirectory,t,!1,this.options.input.gitServerId),this.log("info","MERGE","Successfully pushed branch to remote");const s=this.runner?.getAgentConfiguration(),i=buildPRRequestPrompt(n,(s?.customPRPromptTemplate?applyPRPromptTemplate(s.customPRPromptTemplate,{initialCommitHash:n,currentCommitHash:"",branchName:""}):void 0)??void 0);this.log("debug","MERGE",`PR prompt: ${i.substring(0,200)}...`);const o=this.runner;let r=null;const c=o.runStreamed(i,{cwd:this.workingDirectory,model:this.options.input.model,abortController:this.abortController,modeConfig:this.getRunnerModeConfig(),agentrixTools:this.agentrixTools,structuredOutputSchema:{type:"json_schema",schema:prInfoJsonSchema}});for await(const e of c){if(this.logger.debug(`sdk message: ${JSON.stringify(e)}`),"result"===e.type){r=e;break}const n=a?e:this.messageFilter.filter(e);null!==n&&this.workClient.sendTaskEvent(this.getChatSenderMeta(),n,{groupId:this.currentGroupId??void 0})}if(!r)throw new Error("Merge-request did not return a result message");const p=parsePrInfoFromResult(r),l=await this.workClient.sendMergeRequest(p.title,p.description);this.workClient.sendAssistantMessage(`${p.userMessage}\n\n✅ Pull request created successfully!\nNumber: #${l.pullRequestNumber}\nURL: ${l.pullRequestUrl}`,{groupId:this.currentGroupId??void 0})}catch(e){const a=e instanceof Error?e.message:String(e);this.log("error","MERGE","Merge-request failed:",e),this.workClient.sendSystemErrorMessage(`❌ Merge-request failed: ${a}\n\nPlease check git status and try again, or create the PR manually.`,{groupId:this.currentGroupId??void 0})}}async executeBashCommand(e){this.log("info","BASH",`Executing command: ${e}`);const a={senderType:"agent",senderId:"bash",senderName:"bash"},n=await executeCommandStreaming(e,this.workingDirectory,{onOutput:e=>{this.workClient.sendTaskMessage(a,e,{groupId:this.currentGroupId??void 0})},onComplete:e=>{this.log("info","BASH",`Command completed with exit code: ${e}`)}});this.log("info","BASH",`Worker ready after command execution (exit code: ${n})`)}async executeMergePr(){await executeMergePr({workingDirectory:this.workingDirectory,workClient:this.workClient,repositoryId:this.options.input.repositoryId,gitServerId:this.options.input.gitServerId,logger:this.logger,askUser:e=>this.askUser(e,{onTimeout:"abort_task"})})}async executeNewSession(){this.log("info","SESSION","Executing new-session: clearing agentSessionId"),this.currentAgentSessionId=void 0,this.primarySessionReady=!1,this.workClient.sendResetTaskSession(),this.log("info","SESSION","Session reset sent, stopping task for clean restart"),this.stopTask("event")}async runClaude(){this.log("info","AGENT",`Starting Claude agent for task ${this.taskId}`);const e=this.currentAgentSessionId,a=this.runner,n=this.getRunnerModeConfig(),t="group_chat"===n.mode||"group_work"===n.mode,s=this.createPermissionHandler(),i=this.buildSystemHooks({trackBackgroundTasks:!0,trackPrimaryAgentStop:!0}),o=a.loop({cwd:this.workingDirectory,model:this.options.input.model,agentSessionId:e,abortController:this.abortController,stderr:e=>{this.log("debug","SDK",e)},modeConfig:n,agentrixTools:this.agentrixTools,canUseTool:s,hooks:i,maxTurns:this.options.input.maxTurns??void 0});(async()=>{try{for(;!this.isStopping;){const e=await this.coordinator.waitForAgentMessage();if(!e){if(this.isStopping)break;continue}o.push(e);const a=e.__localSequence;void 0!==a&&(this.markPrimaryMessageProcessed(a),delete e.__localSequence)}}catch(e){this.log("error","AGENT","Message pump failed:",e),this.stopTask("event")}})();for await(const e of o.events){if(this.logger.debug(`sdk message: ${JSON.stringify(e)}`),"system"===e.type&&"init"===e.subtype){this.workClient.sendUpdateTaskAgentSessionId(e.session_id),this.currentAgentSessionId=e.session_id,this.historyDb.upsertAgentSession(this.primaryAgentId,e.session_id),this.primarySessionReady=!0,null!==this.pendingPrimaryLastSequence&&(this.historyDb.updateAgentLastSequence(this.primaryAgentId,this.pendingPrimaryLastSequence),this.pendingPrimaryLastSequence=null),this.refreshGroupId(),this.updateAgentRunning(!0);continue}if("result"===e.type){await this.handleSdkResultMessage(e),this.updateAgentRunning(!1);continue}"system"===e.type&&"task_notification"===e.subtype&&this.handleBackgroundTaskNotification(e);const a=t?e:this.messageFilter.filter(e);null!==a&&this.workClient.sendTaskEvent(this.getChatSenderMeta(),a,{groupId:this.currentGroupId??void 0})}this.log("info","AGENT",`Claude agent finished for task ${this.taskId}`)}updateAgentRunning(e){this.coordinator?.setAgentRunning(this.primaryAgentId,this.primaryAgentName,e)}markPrimaryMessageProcessed(e){this.historyDb.updateAgentLastSequence(this.primaryAgentId,e),this.primarySessionReady||(this.pendingPrimaryLastSequence=null===this.pendingPrimaryLastSequence?e:Math.max(this.pendingPrimaryLastSequence,e))}stopTask(e){this.isStopping||(this.isStopping=!0,"idle"===e?this.log("info","AGENT","Idle timeout reached, stopping task"):"ask_user_timeout"===e&&this.log("info","AGENT","ask_user timed out, stopping task"),this.askUserAwaiter.clear(),this.coordinator?.stop(),this.abortController.abort())}async handleAskUserQuestionPermission(e){const a=e,n=Array.isArray(a.questions)?a.questions:[];if(0===n.length)return this.log("warn","PERMISSION","AskUserQuestion missing questions"),{behavior:"deny",message:"AskUserQuestion missing questions"};const t=n.map(e=>({...e,options:[...e.options,{label:"Other",description:""}]}));try{const e=await this.askUser(t),s={};for(let a=0;a<n.length;a+=1){const t=n[a]?.question;if(!t)continue;const i=e.answers?.[a];"string"==typeof i&&(s[t]=i)}return{behavior:"allow",updatedInput:{...a,answers:s}}}catch(e){return this.log("warn","PERMISSION",`AskUserQuestion failed: ${e}`),{behavior:"deny",message:"AskUserQuestion failed"}}}createPermissionHandler(){return async(e,a)=>{if("AskUserQuestion"===e)return this.handleAskUserQuestionPermission(a);if(this.grantedPermissions.has(e))return this.log("info","PERMISSION",`Tool "${e}" already granted, skipping`),{behavior:"allow",updatedInput:a};const n=this.pendingPermissions.get(e);if(n)return this.log("info","PERMISSION",`Tool "${e}" has pending request, waiting...`),"allow"===await n?{behavior:"allow",updatedInput:a}:{behavior:"deny",message:"Permission denied by user"};let t;this.log("info","PERMISSION",`Requesting permission for "${e}"`);const s=new Promise(e=>{t=e});this.pendingPermissions.set(e,s);try{const n=await this.requestToolPermission(e);return t(n),"allow"===n?(this.grantedPermissions.add(e),{behavior:"allow",updatedInput:a}):{behavior:"deny",message:"Permission denied by user"}}catch(e){return t("deny"),{behavior:"deny",message:"Permission request failed"}}finally{this.pendingPermissions.delete(e)}}}async requestToolPermission(e){const a=[{question:`Tool "${e}" is requesting permission to execute. Allow this operation?`,header:"Permission",multiSelect:!1,options:[{label:"Allow",description:"Allow this tool to execute"},{label:"Deny",description:"Deny this tool execution"}]}];try{return"Allow"===(await this.askUser(a,{onTimeout:"abort_task"})).answers[0]?"allow":"deny"}catch(e){return this.log("warn","PERMISSION",`Permission request failed: ${e}`),"deny"}}async askUser(e,a={}){const n=this.workClient;return askUserWithTimeout(e,this.askUserAwaiter,{sendAskUser:e=>n.sendAskUser(this.getChatSenderMeta(),e,{groupId:this.currentGroupId??void 0}),sendAskUserResponse:(e,a)=>n.sendAskUserResponse(e,a),onTimeoutMessage:e=>n.sendAssistantMessage(e,{groupId:this.currentGroupId??void 0}),stopTask:e=>this.stopTask(e)},a)}async onUncommittedChanges(){const e=[{question:"Uncommitted changes detected in the working directory. How would you like to proceed?",header:"Git Status",multiSelect:!1,options:[{label:"Ignore",description:"Keep changes and continue with the task"},{label:"Commit",description:"Commit current changes before starting"},{label:"Stash",description:"Stash changes (git stash) before starting"},{label:"Abort",description:"Cancel the task, do nothing"}]}];try{const a=(await this.askUser(e,{onTimeout:"abort_task"})).answers[0];return a.startsWith("other:")?(this.log("info","GIT",`User provided custom input: ${a}, defaulting to Abort`),"Abort"):{Ignore:"Ignore",Commit:"Commit",Stash:"Stash",Abort:"Abort"}[a]||"Abort"}catch(e){return this.log("warn","GIT",`Failed to get user response for uncommitted changes: ${e}`),"Abort"}}async onBranchMismatch(e){const a=[{label:"Switch",description:`Checkout ${e.expectedBranch} and continue`},{label:"Keep",description:`Continue on ${e.currentBranch} (may affect task history)`},{label:"Abort",description:"Cancel the task"}],n=[{question:`Branch mismatch detected. Current: ${e.currentBranch}. Expected: ${e.expectedBranch}. How would you like to proceed?`,header:"Git Branch",multiSelect:!1,options:a}];try{const e=(await this.askUser(n,{onTimeout:"abort_task"})).answers[0];return e.startsWith("other:")?(this.log("info","GIT",`User provided custom input: ${e}, defaulting to Abort`),"Abort"):{Switch:"Switch",Keep:"Keep",Abort:"Abort"}[e]||"Abort"}catch(e){return this.log("warn","GIT",`Failed to get user response for branch mismatch: ${e}`),"Abort"}}getRunnerMode(){const e=this.taskAgentsMap.size>1,a=this.options.input.taskType,n=!!process.env.AGENTRIX_COMPANION_WORKSPACE;return"shadow"===a?"companion_shadow":n&&"chat"===a?"companion_chat":e?"chat"===a?"group_chat":"group_work":"chat"===a?"chat":"work"}getGroupAgents(){if(!(this.taskAgentsMap.size<=1))return Array.from(this.taskAgentsMap.values()).map(e=>({id:e.id,name:e.name,description:e.description}))}getRunnerModeConfig(){return{mode:this.getRunnerMode(),supportChangeTitle:this.supportChangeTitle,groupAgents:this.getGroupAgents()}}get supportChangeTitle(){const e=this.options.input.customTitle;return!("string"==typeof e&&e.trim().length>0)}createAgentrixTools(){const e=this.taskAgentsMap.size>1;if("companion_shadow"===this.getRunnerMode()){const e=this.options.input.chatId,a=this.options.input.userId,n=_package.machine.resolveDataDir(a,e);this.chatHistoryDb=getTaskDb({dataDir:n,taskId:e})}return createAgentrixMcpTools({agentContext:this.agentContext,workClient:this.workClient,uploadFile:e=>this.agentContext.uploadFile(e),agentId:this.primaryAgentId,isGroup:e,historyDb:this.historyDb,chatHistoryDb:this.chatHistoryDb??void 0,askUser:e=>this.askUser(e),log:this.log.bind(this),isMergeRequestActive:()=>!1,clearMergeRequest:()=>{},invokeAgent:(e,a)=>this.invokeAgent(e,a),assign:(e,a,n)=>this.assignWork(e,a,n)})}resolveTaskAgentName(e){return this.taskAgentsMap.get(e)?.name||""}getChatSenderMeta(){return{senderType:"agent",senderId:this.primaryAgentId,senderName:this.primaryAgentName}}sendAgentErrorMessage(e,a,n,t){const s=a||e,i={type:"assistant",session_id:"",uuid:crypto.randomUUID(),parent_tool_use_id:null,message:{role:"assistant",content:[{type:"text",text:`System Error\n\n${s}: ${n}`}]}};this.workClient.sendTaskMessage({senderType:"agent",senderId:e,senderName:s},i,{groupId:t?.groupId})}async invokeAgent(e,a){const n=this.buildSubAgentHistoryContext(e,a);if(!n)return!1;const t=this.taskAgentsMap.get(e),s=t?.type||"claude";let i=this.agentQueues.get(e);i||(i=new InProcessQueue,this.agentQueues.set(e,i));const o=this.resolveTaskAgentName(e),r=this.getRunnerMode(),c="group_chat"===r||"group_work"===r;return i.run(async()=>{this.coordinator?.setAgentRunning(e,o,!0);const a=this.newMessageGroupId();try{const t=await AgentRunners.create(s,e,{logger:this.log.bind(this),context:this.agentContext}),i=this.getGroupAgents()||[],r={mode:"reply",supportChangeTitle:!1,groupAgents:i},p=this.createPermissionHandler(),l=this.buildSystemHooks({trackBackgroundTasks:!1}),d=createMessageFilter(),u=t.loop({cwd:this.workingDirectory,model:this.options.input.model,agentSessionId:n.sessionId,abortController:this.abortController,modeConfig:r,agentrixTools:this.agentrixTools,canUseTool:p,hooks:l,maxTurns:this.options.input.maxTurns??void 0});let m=n.message;if("codex"===s&&!n.sessionId){const a=[buildAgentContextPrompt(e,i),"=== CONVERSATION STREAM START FROM HERE ===",extractUserMessageText(n.message)].join("\n\n").trim();a&&(m=a)}u.push(m);const g=n.lastSequence;let h=!1;n.sessionId&&(this.historyDb.updateAgentLastSequence(e,g),h=!0);let f=!1;for await(const n of u.events){if("system"===n.type&&"init"===n.subtype){this.historyDb?.upsertAgentSession(e,n.session_id),h||(this.historyDb.updateAgentLastSequence(e,g),h=!0);continue}if("result"===n.type){this.workClient.sendTaskMessage({senderType:"agent",senderId:e,senderName:o},n,{groupId:a}),f=!0;break}const t=c?n:d.filter(n);t&&this.workClient.sendTaskEvent({senderType:"agent",senderId:e,senderName:o},t,{groupId:a})}}catch(a){this.log("error","INVOKE",`Invoke failed for ${e}:`,a)}finally{this.coordinator?.setAgentRunning(e,o,!1)}}),!0}async assignWork(e,a,n){const t=this.taskAgentsMap.get(e),s=t?.type||"claude";let i=this.agentQueues.get(e);i||(i=new InProcessQueue,this.agentQueues.set(e,i));const o=this.resolveTaskAgentName(e),r=this.getRunnerMode(),c="group_chat"===r||"group_work"===r;return i.run(async()=>{this.coordinator?.setAgentRunning(e,o,!0);const t=this.newMessageGroupId();n&&this.workClient.sendTaskMessage({senderType:"agent",senderId:e,senderName:o},createClaudeAssistantMessage(n),{groupId:this.newMessageGroupId()});try{const n=await AgentRunners.create(s,e,{logger:this.log.bind(this),context:this.agentContext}),i={mode:"work",supportChangeTitle:!1},r=this.createPermissionHandler(),p=this.buildSystemHooks({trackBackgroundTasks:!1}),l=createMessageFilter(),d=n.loop({cwd:this.workingDirectory,model:this.options.input.model,abortController:this.abortController,modeConfig:i,agentrixTools:this.agentrixTools,canUseTool:r,hooks:p,maxTurns:this.options.input.maxTurns??void 0});d.push(a);let u=!1;for await(const a of d.events){if("system"===a.type&&"init"===a.subtype)continue;if("result"===a.type){this.workClient.sendTaskMessage({senderType:"agent",senderId:e,senderName:o},a,{groupId:t}),u=!0;break}const n=c?a:l.filter(a);n&&this.workClient.sendTaskEvent({senderType:"agent",senderId:e,senderName:o},n,{groupId:t})}}catch(a){this.log("error","RUN_TASK",`Run task failed for ${e}:`,a);const n=a instanceof Error?a.message:String(a);this.sendAgentErrorMessage(e,o,`I meet some error: ${n}`,{groupId:t})}finally{this.coordinator?.setAgentRunning(e,o,!1)}})}buildSubAgentHistoryContext(e,a){const n=this.historyDb;if(!n)return this.log("warn","HISTORY","Task history DB unavailable; delegate cannot build context."),null;const t=n.getAgentSessions().get(e),s=n.getAgentLastSequences().get(e)??0,i=n.pageRecentMessagesAfter(s,20);if(0===i.data.length&&!a)return null;const o=this.mergeConsecutiveHumanMessages(i.data),r=this.buildHistoryMessages(o,a);return r?{message:r,sessionId:t,lastSequence:i.data.length>0?i.data[i.data.length-1].localSequence:s}:null}buildHistoryMessages(e,a){const n=[];for(const a of e){const e=formatHistoryMessageXml(a);e&&n.push(e)}if(0===n.length&&!a)return null;let t=n.join("\n");return a&&(t=`<hint>\n${a}\n</hint>\n\n${t}`),{type:"user",message:{role:"user",content:t},parent_tool_use_id:null,session_id:""}}buildSystemHooks(e){const a=e?.trackBackgroundTasks??!0,n=e?.trackPrimaryAgentStop??!1,t={};return a&&(t.PostToolUse=async e=>(this.trackBackgroundTaskFromPostToolUse(e),{})),n&&(t.Stop=async()=>(this.updateAgentRunning(!1),{})),t}trackBackgroundTaskFromPostToolUse(e){if(!e||"object"!=typeof e)return void this.log("debug","TASK","PostToolUse hook input is not an object");const a=e,n=a.tool_input;if(!n||!0!==n.run_in_background)return;const t=this.extractBackgroundTaskId(a.tool_response);if(!t)return this.log("debug","TASK",`PostToolUse(${a.tool_name}) run_in_background=true but no task_id found, using anonymous tracking`),void this.coordinator?.setAnonymousBackgroundTaskRunning(!0);this.coordinator?.setBackgroundTaskRunning(t,!0),this.log("info","TASK",`Background task started: ${t} (tool: ${a.tool_name})`)}handleBackgroundTaskNotification(e){this.updateAgentRunning(!0),this.coordinator?.setBackgroundTaskRunning(e.task_id,!1),this.log("info","TASK",`Background task ${e.task_id} ${e.status}`)}extractBackgroundTaskId(e){const a=new Set,n=new Set,t=e=>{if("string"!=typeof e)return;const n=e.trim();n&&a.add(n)},s=e=>{if(null==e)return;if("string"==typeof e)return void(e=>{const a=/(task[_-]?id|agent[_-]?id|shell[_-]?id)["'\s:=]+([A-Za-z0-9._:-]+)/gi;let n;for(;null!==(n=a.exec(e));)t(n[2])})(e);if("object"!=typeof e)return;if(n.has(e))return;if(n.add(e),Array.isArray(e)){for(const a of e)s(a);return}const a=e;"string"==typeof a.task_id&&t(a.task_id),"string"==typeof a.taskId&&t(a.taskId),"string"==typeof a.agent_id&&t(a.agent_id),"string"==typeof a.agentId&&t(a.agentId),"string"==typeof a.shell_id&&t(a.shell_id),"string"==typeof a.shellId&&t(a.shellId);for(const e of Object.values(a))s(e)};s(e);const i=[...a];return i.length>1&&this.log("warn","TASK",`Multiple background task ids extracted (${i.join(", ")}), using first id ${i[0]}`),i[0]}createWorkerClientConfig(e,a,n){const t=this.options.input.agentId,s=this.taskAgentsMap.get(t)?.name;return{config:{userId:e,taskId:a,chatId:this.options.input.chatId,machineId:this.credentials.machineId,agentId:t,agentName:s,cwd:n,serverUrl:_package.machine.serverUrl.replace(/^http/,"ws"),path:"/v1/ws",auth:shared.workerAuth(this.credentials.token,this.credentials.machineId,a),dataEncryptionKey:this.options.dataEncryptionKey??null,keepAliveConfig:{intervalMs:2e4,event:"worker-alive",payloadGenerator:()=>{const e=this.coordinator?.getStatus(),n="running"===e?.state?"worker-running":"worker-ready";return{eventId:shared.createEventId(),status:n,taskId:a,machineId:this.credentials.machineId,timestamp:Date.now().toString(),activeAgents:this.coordinator?.getActiveAgents()}}},healthCheckConfig:{enabled:!0,intervalMs:3e4,timeoutMs:5e3},logger:(e,...a)=>this.logger.info(`[SOCKET] ${e}`,...a)},handlers:{attachmentsDir:_package.machine.resolveAttachmentsDir(e,a),logger:(e,a,n,...t)=>{this.log(e,a,n,...t)},stopTask:async()=>{this.stopTask("event")},shouldPersistTaskMessage:async e=>!shared.isCompanionHeartbeatMessage(e)||!this.shouldDropHeartbeatWhileBusy()||(this.log("debug","WORKER","Dropping heartbeat at WorkerClient receive stage: agent is running"),!1),onTaskMessage:async(e,a)=>{if(shared.isAskUserResponseMessage(e)){const[a,n]=this.askUserAwaiter.entries().next().value||[];a&&n&&(this.askUserAwaiter.delete(a),n(e))}},onTaskInfoUpdate:async e=>{applyTaskInfoUpdate(e,this.options.input)},onWorkerStatusRequest:async()=>{const{state:e}=this.coordinator.getStatus();"running"===e?this.workClient.sendWorkRunning():"idle"===e&&this.workClient.sendWorkerReady()},onSubTaskResultUpdated:async e=>{const a=buildSubTaskResultMessage(e,this.options.dataEncryptionKey);await this.coordinator.enqueue(a)}}}}async exitWorker(e){this.log("info","WORKER",`Exiting with status: ${e} for task ${this.taskId}`),this.coordinator&&this.coordinator.stop(),this.workClient&&(this.workClient.sendWorkerExit(e),await this.workClient.disconnect()),this.historyDb&&this.historyDb.close(),this.chatHistoryDb&&this.chatHistoryDb.close(),process.exit(0)}async reportFatalError(e){this.workClient.sendSystemErrorMessage(e,{groupId:this.currentGroupId??void 0})}log(e,a,n,...t){this.logger&&this.logger[e](`[${a}] ${n}`,...t)}get taskId(){return this.options.input.taskId}async handleSdkResultMessage(e){let a,n;try{const e=await this.workspace.prepareResultArtifacts({onCommitError:e=>{this.log("warn","GIT","Failed to auto-commit changes before result message:",e)},onPatchError:e=>{this.log("warn","GIT","Failed to write patch diff for result:",e)}});a=e.artifacts,n=e.currentCommitHash}catch(e){this.log("warn","GIT","Failed to prepare git artifacts for result:",e)}const t=this.getRunnerMode();if("group_chat"===t||"group_work"===t?this.workClient.sendTaskEvent(this.getChatSenderMeta(),e,{...a?{artifacts:a}:{},groupId:this.currentGroupId??void 0}):this.workClient.sendTaskMessage(this.getChatSenderMeta(),e,{...a?{artifacts:a}:{},groupId:this.currentGroupId??void 0}),n)try{await markCommitAsSent(this.options.input.userId,this.taskId,n)}catch(e){this.log("warn","GIT","Failed to mark commit as sent:",e)}}}class CwdCalculator{static async calculateFinalCwd(e){const{repositorySourceType:a,cwd:n,userCwd:t,userId:s,taskId:i,forceUserCwd:o}=e;if(n)return n;const r=_package.machine.resolveProjectDir(s,i);if("directory"===a&&t){const e=t.replace(/^~/,os.homedir());return o?e:await this.shouldUseWorktree(e)?r:e}return r}static async shouldUseWorktree(e){try{return!isDirectoryEmpty(e)&&await isGitRepository(e)}catch{return!1}}}async function runClaude(e,a){const n=buildWorkspaceOptions(a.input),t=await CwdCalculator.calculateFinalCwd(n),s=new ClaudeWorker(e,a,t);await s.start()}var require$$0=getAugmentedNamespace(_package.logger$1);class CodexWorker{constructor(e,a){this.credentials=e,this.options=a}context;threadId=null;isStopping=!1;filteredToolUseIds=new Set;currentModel=null;dataEncryptionKey=null;abortController=new AbortController;coordinator;logger;askUserAwaiter=new Map;workClient;workspace;historyDb=null;currentGroupId=null;refreshGroupId(){this.currentGroupId=`group-${node_crypto.randomUUID()}`}async start(){try{await this.initialize(),await this.handleEvent(),await this.runCodex(),await this.exitWorker("completed")}catch(e){if(!this.isStopping){this.log("warn","AGENT","Fatal error:",e);const a=e instanceof Error?e.message:String(e);throw await this.exitWorker("error",a),e}this.log("info","AGENT",`Task ${this.taskId} stopped gracefully`),await this.exitWorker("completed")}finally{process.exit(0)}}async initialize(){const e=this.options.input.taskId,a=this.options.input.userId;this.logger=this.createLogger({type:"worker",taskId:e}),this.dataEncryptionKey=this.options.dataEncryptionKey??null;const n=buildWorkspaceOptions(this.options.input),t=await CwdCalculator.calculateFinalCwd(n),s={...n,cwd:t};this.log("info","INIT",`Phase 1: Working directory: ${t}`);const i=this.createWorkerClientConfig(a,e,t),o=_package.machine.resolveDataDir(a,e);this.historyDb=getTaskDb({dataDir:o,taskId:e});const r=new WorkerClient(i.config,{...i.handlers,historyDb:this.historyDb});this.workClient=r,this.log("info","INIT","Phase 2: WorkerClient created");const c=1e3*Math.max(0,this.options.idleTimeoutSecond??0);this.coordinator=this.createMessageCoordinator(r,c),this.log("info","INIT","Phase 3: Coordinator created"),await r.connect(),r.sendWorkerInitializing(),this.log("info","INIT","Phase 4: Connected to server"),this.log("info","INIT","Phase 5: Skipped (no AgentContext for Codex)"),this.log("info","INIT","Phase 6: Skipped (no custom resources for Codex)");const p=new Workspace({options:s,handlers:this.createWorkspaceHandlers(r)}),{initialCommitHash:l,gitStateResult:d}=await p.setup();this.workspace=p,this.log("info","INIT","Phase 7: Workspace setup complete"),r.sendWorkerInitialized(),this.log("info","INIT","Phase 8: Initialization finalized"),await this.registerWithDaemon(t),this.log("info","INIT","Phase 9: Registered with daemon"),this.context={credentials:this.credentials,options:this.options,workClient:r,workingDirectory:t,initialCommitHash:l,logger:this.logger},process.env.AGENTRIX_WORKING_DIR=t,process.env.AGENTRIX_WORKING_USER=a,process.env.AGENTRIX_WORKING_TASK=e,this.options.input.environmentVariables&&Object.entries(this.options.input.environmentVariables).forEach(([e,a])=>{null!=a&&(process.env[e]=String(a))}),this.options.input.api_base_url&&(process.env.OPENAI_BASE_URL=this.options.input.api_base_url),this.options.input.api_key&&(process.env.CODEX_API_KEY=this.options.input.api_key),"agentSessionId"in this.options.input&&this.options.input.agentSessionId&&(this.threadId=this.options.input.agentSessionId,this.log("info","AGENT",`Resuming thread: ${this.threadId}`))}createWorkspaceHandlers(e){return{onRepositoryDetected:a=>{e.associateRepository(a.host,a.owner,a.repo,a.url)},onUncommittedChanges:this.onUncommittedChanges.bind(this),onBranchMismatch:this.onBranchMismatch.bind(this)}}async registerWithDaemon(e){const a=this.options.input.taskId,n=await notifyDaemonSessionStarted(a,{cwd:e,machineId:this.credentials.machineId,pid:process.pid,startedBy:this.options.startedBy||"terminal"});n.error?this.log("warn","DAEMON",`Failed to report session ${a}:`,n.error):this.log("info","DAEMON",`Session ${a} registered`)}createMessageCoordinator(e,a){return this.coordinator=new Coordinator({workerType:"codex",workClient:e,handlers:{onNormalMessage:async e=>this.convertSDKMessageToCodexInput(e),onBashCommand:async(e,a)=>{await this.executeBashCommand(e)},onMergeRequest:async e=>{await this.executeMergeRequest()},onMergePr:async()=>{await this.executeMergePr()},onNewSession:async()=>{await this.executeNewSession()}},logger:(e,a,n)=>{const t=e;this.log(t,a,n)},idleTimeoutMs:a,onIdleTimeout:()=>this.stopTask("idle")}),this.coordinator}async handleEvent(){if("task-message"===this.options.input.event){const e=this.options.input.eventData.message;e&&shared.isSDKMessage(e)&&"user"===e.type&&await this.coordinator.enqueue(e)}}async executeMergeRequest(){this.log("info","MERGE","Executing merge-request command");try{if(!this.options.input.repositoryId){const e="Cannot create PR: task has no git repository configured.";return this.log("warn","MERGE","No repositoryId found in task input"),void this.context.workClient.sendSystemErrorMessage(e,{groupId:this.currentGroupId??void 0})}await hasUncommittedChanges(this.context.workingDirectory)&&(await autoCommit(this.context.workingDirectory,"Update task changes"),this.log("info","MERGE","Auto-committed changes"));const e=await getCurrentCommitHash(this.context.workingDirectory),a=this.context.initialCommitHash,n=await getCurrentBranch(this.context.workingDirectory);if(this.log("info","MERGE",`Pushing branch ${n} to remote`),await pushForTask(this.context.workingDirectory,n,!1,this.options.input.gitServerId),this.log("info","MERGE","Successfully pushed branch to remote"),!a){const e="Cannot create PR: initial commit hash is missing.";return this.log("error","MERGE",e),void this.context.workClient.sendSystemErrorMessage(e,{groupId:this.currentGroupId??void 0})}if(0===(await getDiffStats(this.context.workingDirectory,a,e)).files.length){const e="No changes to create PR: no files changed since task started";return void this.context.workClient.sendSystemErrorMessage(e,{groupId:this.currentGroupId??void 0})}const t=buildPRRequestPrompt(a);this.log("debug","MERGE",`PR prompt: ${t.substring(0,200)}...`);const s=this.options.input.agentId??"default",i=await AgentRunners.create("codex",s),o={mode:"work",supportChangeTitle:!1},r=i.runStreamed(t,{cwd:this.context.workingDirectory,model:this.currentModel||void 0,abortController:this.abortController,modeConfig:o,structuredOutputSchema:{type:"json_schema",schema:prInfoOpenAiSchema}});let c=null;for await(const e of r){if(this.context.logger.debug(`sdk message: ${JSON.stringify(e)}`),"result"===e.type){c=e;break}const a=this.filterMessages(e);null!==a&&this.context.workClient.sendTaskEvent(this.getChatSenderMeta(),a,{groupId:this.currentGroupId??void 0})}if(!c)throw new Error("Merge-request did not return a result message");const p=parsePrInfoFromResult(c);await this.createPullRequest(p.title,p.description),this.sendMessage(p.userMessage)}catch(e){const a=e instanceof Error?e.message:String(e);this.log("error","MERGE","Merge-request failed:",e),this.context.workClient.sendSystemErrorMessage(`Merge-request failed: ${a}\n\n`,{groupId:this.currentGroupId??void 0})}}async executeChangeTitle(e){this.log("info","WORKER",`Changing task title to: ${e}`),this.context.workClient.sendChangeTaskTitle(e)}async executeBashCommand(e){this.log("info","BASH",`Executing command: ${e}`);const a=await executeCommandStreaming(e,this.context.workingDirectory,{onOutput:e=>{this.context.workClient.sendTaskMessage(this.getChatSenderMeta(),e,{groupId:this.currentGroupId??void 0})},onComplete:e=>{this.log("info","BASH",`Command completed with exit code: ${e}`)}});this.log("info","BASH",`Worker ready after command execution (exit code: ${a})`)}async executeMergePr(){await executeMergePr({workingDirectory:this.context.workingDirectory,workClient:this.context.workClient,repositoryId:this.options.input.repositoryId,gitServerId:this.options.input.gitServerId,logger:this.context.logger,askUser:e=>this.askUser(e,{onTimeout:"abort_task"})})}async executeNewSession(){this.log("info","SESSION","Executing new-session: clearing threadId"),this.threadId=null,this.context.workClient.sendResetTaskSession(),this.log("info","SESSION","Session reset sent, stopping task for clean restart"),this.stopTask("event")}async runCodex(){this.log("info","AGENT",`Starting Codex agent for task ${this.taskId}`),this.currentModel=this.options.input.model||null,this.currentModel?this.log("info","AGENT",`Using model: ${this.currentModel}`):this.log("info","AGENT","Using default model from Codex config");const e=this.options.input.agentId??"default",a=(await AgentRunners.create("codex",e)).loop({cwd:this.context.workingDirectory,model:this.currentModel||void 0,agentSessionId:this.threadId??void 0,abortController:this.abortController,modeConfig:{mode:"work",supportChangeTitle:!1}});(async()=>{try{for(;!this.isStopping;){const e=await this.coordinator.waitForAgentMessage();if(e)a.push(e);else if(this.isStopping)break}}catch(e){this.log("error","AGENT","Message pump failed:",e),this.stopTask("event")}})();for await(const e of a.events){if(this.context.logger.debug(`sdk message: ${JSON.stringify(e)}`),"system"===e.type&&"init"===e.subtype){this.threadId=e.session_id,this.context.workClient.sendUpdateTaskAgentSessionId(e.session_id),this.log("info","AGENT",`Thread started: ${e.session_id}`),this.refreshGroupId(),this.updateAgentRunning(!0);continue}const a=this.filterMessages(e);null!==a&&("result"===e.type?await this.handleSdkResultMessage(a):this.context.workClient.sendTaskEvent(this.getChatSenderMeta(),a,{groupId:this.currentGroupId??void 0})),"result"===e.type?this.updateAgentRunning(!1):this.updateAgentRunning(!0)}this.log("info","AGENT",`Codex agent finished for task ${this.taskId}`)}filterMessages(e){const a=e,n=a?.message?.content;if(!n||"string"==typeof n)return e;const t=n.filter(e=>"tool_use"===e.type&&"agentrix"===e.server_name?(this.filteredToolUseIds.add(e.id),!1):!("tool_result"===e.type&&this.filteredToolUseIds.has(e.tool_use_id)||"user"===a.type&&"tool_result"!==e.type));return 0===t.length?null:(a.message.content=t,a)}sendMessage(e){const a={type:"assistant",message:{id:node_crypto.randomUUID().toString(),type:"message",container:null,role:"assistant",content:[{citations:null,type:"text",text:e}],model:this.currentModel||"",usage:{},stop_reason:null,context_management:null,stop_sequence:null},parent_tool_use_id:null,session_id:"",uuid:node_crypto.randomUUID().toString()};this.getActiveWorkClient().sendTaskMessage(this.getChatSenderMeta(),a,{groupId:this.currentGroupId??void 0})}async askUser(e,a={}){const n=this.getActiveWorkClient();return askUserWithTimeout(e,this.askUserAwaiter,{sendAskUser:e=>n.sendAskUser(this.getChatSenderMeta(),e,{groupId:this.currentGroupId??void 0}),sendAskUserResponse:(e,a)=>n.sendAskUserResponse(e,a),onTimeoutMessage:e=>this.sendMessage(e),stopTask:e=>this.stopTask(e)},a)}getActiveWorkClient(){const e=this.context?.workClient??this.workClient;if(!e)throw new Error("[WORKER] WorkerClient not available");return e}resolveTaskAgentName(e){const a=this.options.input.taskAgents??[];return a.find(a=>a.id===e)?.name||""}getChatSenderMeta(){const e=this.options.input.agentId;return{senderType:"agent",senderId:e,senderName:this.resolveTaskAgentName(e)??""}}async onUncommittedChanges(){const e=[{question:"Uncommitted changes detected in the working directory. How would you like to proceed?",header:"Git Status",multiSelect:!1,options:[{label:"Ignore",description:"Keep changes and continue with the task"},{label:"Commit",description:"Commit current changes before starting"},{label:"Stash",description:"Stash changes (git stash) before starting"},{label:"Abort",description:"Cancel the task, do nothing"}]}];try{const a=(await this.askUser(e,{onTimeout:"abort_task"})).answers[0];return a.startsWith("other:")?(this.log("info","GIT",`User provided custom input: ${a}, defaulting to Abort`),"Abort"):{Ignore:"Ignore",Commit:"Commit",Stash:"Stash",Abort:"Abort"}[a]||"Abort"}catch(e){return this.log("warn","GIT",`Failed to get user response for uncommitted changes: ${e}`),"Abort"}}async onBranchMismatch(e){const a=[{label:"Switch",description:`Checkout ${e.expectedBranch} and continue`},{label:"Keep",description:`Continue on ${e.currentBranch} (may affect task history)`},{label:"Abort",description:"Cancel the task"}],n=[{question:`Branch mismatch detected. Current: ${e.currentBranch}. Expected: ${e.expectedBranch}. How would you like to proceed?`,header:"Git Branch",multiSelect:!1,options:a}];try{const e=(await this.askUser(n,{onTimeout:"abort_task"})).answers[0];return e.startsWith("other:")?(this.log("info","GIT",`User provided custom input: ${e}, defaulting to Abort`),"Abort"):{Switch:"Switch",Keep:"Keep",Abort:"Abort"}[e]||"Abort"}catch(e){return this.log("warn","GIT",`Failed to get user response for branch mismatch: ${e}`),"Abort"}}async createPullRequest(e,a){this.log("info","MERGE",`Creating PR: ${e}`);try{const n=await this.context.workClient.sendMergeRequest(e,a);this.sendMessage(`✅ Pull request created successfully!\nNumber: #${n.pullRequestNumber}\nURL: ${n.pullRequestUrl}`)}catch(e){this.log("error","MERGE","Failed to create PR:",e),this.sendMessage(`❌ Failed to create pull request: ${e instanceof Error?e.message:"Unknown error"}`)}}async convertSDKMessageToCodexInput(e){const a=e.message.content;if("string"==typeof a)return a;if(Array.isArray(a)){const e=[],n=_package.machine.resolveAttachmentsDir(this.options.input.userId,this.taskId);for(const t of a)if("text"===t.type&&t.text)e.push(t.text);else if("image"===t.type&&t.source&&t.source.url){const a=t.source.url;try{const{filePath:t}=await downloadFile(a,n,!1);this.log("info","IMAGE",`Downloaded image from ${a} to ${t}`),e.push(`Image: ${t}`)}catch(e){this.log("error","IMAGE",`Failed to download image from ${a}:`,e)}}else if("document"===t.type&&t.source&&t.source.url){const a=t.source.url;try{const{filePath:s,mimeType:i,filename:o}=await downloadFile(a,n,!0);this.log("info","DOCUMENT",`Downloaded document from ${a} to ${s}`);const r=t.title||o;e.push(`Document: ${s}\nTitle: ${r}\nType: ${i}`)}catch(e){this.log("error","DOCUMENT",`Failed to download document from ${a}:`,e)}}const t=e.map(e=>e.trim()).filter(Boolean).join("\n\n").trim();if(t)return t}return""}stopTask(e){this.isStopping||(this.isStopping=!0,"idle"===e?this.log("info","AGENT","Idle timeout reached, stopping task"):"ask_user_timeout"===e&&this.log("info","AGENT","ask_user timed out, stopping task"),this.askUserAwaiter.clear(),this.coordinator?.stop(),this.abortController.abort())}updateAgentRunning(e){this.coordinator?.updateAgentRunning(e)}createWorkerClientConfig(e,a,n){const t=this.options.input.agentId,s=this.options.input.taskAgents?.find(e=>e.id===t)?.name;return{config:{userId:e,taskId:a,chatId:this.options.input.chatId,machineId:this.credentials.machineId,agentId:t,agentName:s,cwd:n,serverUrl:_package.machine.serverUrl.replace(/^http/,"ws"),path:"/v1/ws",auth:shared.workerAuth(this.credentials.token,this.credentials.machineId,a),dataEncryptionKey:this.dataEncryptionKey,keepAliveConfig:{intervalMs:2e4,event:"worker-alive",payloadGenerator:()=>{const e=this.coordinator?.getStatus(),n="running"===e?.state?"worker-running":"worker-ready";return{eventId:shared.createEventId(),status:n,taskId:a,machineId:this.credentials.machineId,timestamp:Date.now().toString()}}},healthCheckConfig:{enabled:!0,intervalMs:3e4,timeoutMs:5e3},logger:(e,...a)=>(this.context?.logger??this.logger)?.info(`[SOCKET] ${e}`,...a)},handlers:{stopTask:async()=>{this.stopTask("event")},onTaskMessage:async e=>{if(shared.isAskUserResponseMessage(e)){const[a,n]=this.askUserAwaiter.entries().next().value||[];return void(a&&n&&(this.askUserAwaiter.delete(a),n(e)))}shared.isSDKMessage(e)&&"user"===e.type&&await this.coordinator.enqueue(e)},onTaskInfoUpdate:async e=>{applyTaskInfoUpdate(e,this.options.input)},onWorkerStatusRequest:async()=>{if(!this.context?.workClient)return;if(!this.coordinator)return;const{state:e}=this.coordinator.getStatus();"running"===e?this.context.workClient.sendWorkRunning():"idle"===e&&this.context.workClient.sendWorkerReady()}}}}async exitWorker(e,a){this.coordinator&&this.coordinator.stop(),this.log("info","WORKER",`Exiting with status: ${e} for task ${this.taskId}`),"error"===e&&a?await this.context.workClient.sendErrorMessageAndExit(a):(this.context.workClient.sendWorkerExit(e),await this.context.workClient.disconnect()),this.historyDb&&this.historyDb.close()}createLogger(e){const{createLogger:a}=require$$0;return a(e)}log(e,a,n,...t){const s=this.context?.logger??this.logger;s&&s[e](`[${a}] ${n}`,...t)}get taskId(){return this.options.input.taskId}getCurrentModel(){return this.currentModel||"gpt-5"}async handleSdkResultMessage(e){let a,n;try{const e=await this.workspace.prepareResultArtifacts({onCommitError:e=>{this.log("warn","GIT","Failed to auto-commit changes before result message:",e)},onPatchError:e=>{this.log("warn","GIT","Failed to write patch diff for result:",e)}});a=e.artifacts,n=e.currentCommitHash}catch(e){this.log("warn","GIT","Failed to prepare git artifacts for result:",e)}if(this.context.workClient.sendTaskMessage(this.getChatSenderMeta(),e,{...a?{artifacts:a}:{},groupId:this.currentGroupId??void 0}),n)try{await markCommitAsSent(this.options.input.userId,this.taskId,n)}catch(e){this.log("warn","GIT","Failed to mark commit as sent:",e)}}}async function runCodex(e,a){const n=new CodexWorker(e,a);await n.start()}async function copyDirectory(e,a){await fs$1.promises.mkdir(a,{recursive:!0});const n=await fs$1.promises.readdir(e,{withFileTypes:!0});for(const t of n){const n=path$1.join(e,t.name),s=path$1.join(a,t.name);t.isDirectory()?await copyDirectory(n,s):await fs$1.promises.copyFile(n,s)}}function createWorkerClient(e,a,n){const t=_package.machine.serverUrl.replace(/^http/,"ws");return socket_ioClient.io(t,{path:"/v1/ws",transports:["websocket"],auth:{token:e.token,clientType:"worker",machineId:e.machineId,taskId:n}})}async function runDeployment(e,a){const n=a.input,{taskId:t,sourcePath:s,targetAgentId:i,userId:o,name:r,avatar:c,isSystemAgent:p,supportLocal:l}=n;let d=null;try{if(console.log(`[Deployment] Starting deployment worker for task ${t}`),!fs$1.existsSync(s))throw new Error(`Source path not found: ${s}`);const a=path$1.join(_package.machine.agentrixAgentsHomeDir,i);if(fs$1.existsSync(a))throw new Error(`Target agent directory already exists: ${a}`);console.log(`[Deployment] Copying from ${s} to ${a}`),await copyDirectory(s,a),console.log("[Deployment] Deployment completed successfully"),d=createWorkerClient(e,o,t),await new Promise((e,a)=>{const n=setTimeout(()=>{a(new Error("WebSocket connection timeout"))},1e4);d.on("connect",()=>{clearTimeout(n),console.log("[Deployment] Connected to server"),d.emit("deploy-agent-complete",{eventId:shared.createEventId(),taskId:t,targetAgentId:i,success:!0,name:r,avatar:c,isSystemAgent:p,supportLocal:l}),console.log("[Deployment] Sent deploy-agent-complete event"),setTimeout(()=>{e()},1e3)}),d.on("connect_error",e=>{clearTimeout(n),a(e)})})}catch(e){throw console.error("[Deployment] Deployment failed:",e),d&&d.connected&&(d.emit("deploy-agent-complete",{eventId:shared.createEventId(),taskId:t,targetAgentId:i,success:!1,error:e instanceof Error?e.message:String(e)}),await new Promise(e=>setTimeout(e,1e3))),e}finally{d&&d.disconnect(),process.exit(0)}}async function runCompanion(e,a){const{agentDir:n,workspaceDir:t}=await ensureCompanionAgent();a.input.agentDir=n,process.env.AGENTRIX_COMPANION_WORKSPACE=t;const s=buildWorkspaceOptions(a.input),i=await CwdCalculator.calculateFinalCwd(s),o=new ClaudeWorker(e,a,i);await o.start()}const workerTypes=["claude","codex","deployment","companion"],workerRegistry={claude:{async run({credentials:e,startedBy:a,userId:n,taskId:t,idleTimeoutSecond:s}){const i=_package.machine.readTaskInput(n,t),o=i.dataEncryptionKey?shared.decodeBase64(i.dataEncryptionKey):null;if(o&&32!==o.length)throw new Error("Invalid dataEncryptionKey: expected decrypted 32-byte key");const r={startedBy:a,idleTimeoutSecond:s,input:i,dataEncryptionKey:o};await runClaude(e,r)}},codex:{async run({credentials:e,startedBy:a,userId:n,taskId:t,idleTimeoutSecond:s}){const i=_package.machine.readTaskInput(n,t),o=i.dataEncryptionKey?shared.decodeBase64(i.dataEncryptionKey):null;if(o&&32!==o.length)throw new Error("Invalid dataEncryptionKey: expected decrypted 32-byte key");const r={startedBy:a,idleTimeoutSecond:s,input:i,dataEncryptionKey:o};await runCodex(e,r)}},deployment:{async run({credentials:e,startedBy:a,userId:n,taskId:t,idleTimeoutSecond:s}){const i={input:_package.machine.readTaskInput(n,t)};await runDeployment(e,i)}},companion:{async run({credentials:e,startedBy:a,userId:n,taskId:t,idleTimeoutSecond:s}){const i=_package.machine.readTaskInput(n,t),o=i.dataEncryptionKey?shared.decodeBase64(i.dataEncryptionKey):null;if(o&&32!==o.length)throw new Error("Invalid dataEncryptionKey: expected decrypted 32-byte key");const r={startedBy:a,idleTimeoutSecond:s,input:i,dataEncryptionKey:o};await runCompanion(e,r)}}};async function checkForUpgrades(){const e=_package.packageJson.version;try{const a=child_process.execSync("npm view @agentrix/cli version",{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}).trim();return{hasUpgrade:compareVersions(a,e)>0,currentVersion:e,latestVersion:a}}catch(a){return{hasUpgrade:!1,currentVersion:e,latestVersion:null}}}function compareVersions(e,a){const n=e.split(".").map(Number),t=a.split(".").map(Number);for(let e=0;e<Math.max(n.length,t.length);e++){const a=n[e]||0,s=t[e]||0;if(a>s)return 1;if(a<s)return-1}return 0}function displayUpgradeNotification(e){e.hasUpgrade&&e.latestVersion&&(console.log(""),console.log(chalk.yellow("┌────────────────────────────────────────────────────┐")),console.log(chalk.yellow("│")+" "+chalk.bold("Upgrade Available")+" "+chalk.yellow("│")),console.log(chalk.yellow("│")+" "+chalk.yellow("│")),console.log(chalk.yellow("│")+` Current: ${chalk.dim(e.currentVersion)} → Latest: ${chalk.green.bold(e.latestVersion)} `+chalk.yellow("│")),console.log(chalk.yellow("│")+" "+chalk.yellow("│")),console.log(chalk.yellow("│")+" Run "+chalk.cyan.bold("agentrix upgrade")+" to upgrade "+chalk.yellow("│")),console.log(chalk.yellow("│")+" "+chalk.yellow("│")),console.log(chalk.yellow("│")+" To enable auto-upgrade, set: "+chalk.yellow("│")),console.log(chalk.yellow("│")+" "+chalk.dim("AGENTRIX_DISABLE_AUTO_UPGRADE=false")+" "+chalk.yellow("│")),console.log(chalk.yellow("└────────────────────────────────────────────────────┘")),console.log(""))}function isAutoUpgradeDisabled(){return"true"===process.env.AGENTRIX_DISABLE_AUTO_UPGRADE}async function performAutoUpgrade(e){try{const{execSync:a}=await import("child_process");return console.log(""),e||(console.log(chalk.blue("🔄 Checking for upgrades...")),e=await checkForUpgrades()),e.hasUpgrade?(console.log(chalk.blue(`🔄 Upgrading from ${e.currentVersion} to ${e.latestVersion}...`)),a("npm install -g @agentrix/cli@latest",{stdio:"inherit"}),console.log(chalk.green("✓ Upgrade complete")),console.log(""),!0):(console.log(chalk.green("✓ Already on latest version")),console.log(""),!0)}catch(e){return console.log(""),console.log(chalk.yellow("⚠️ Auto-upgrade failed")),console.log(chalk.dim(" You can upgrade manually with: npm install -g @agentrix/cli@latest")),console.log(""),!1}}const UPGRADE_CHECK_INTERVAL=216e5;function getUpgradeDaemonStatePath(){const e=_package.machine.getStatePaths();return path.join(path.dirname(e.daemonStateFile),"upgrade-daemon.state.json")}function readUpgradeDaemonState(){try{const e=getUpgradeDaemonStatePath();if(!fs.existsSync(e))return null;const a=fs.readFileSync(e,"utf-8");return JSON.parse(a)}catch{return null}}function writeUpgradeDaemonState(e){const a=getUpgradeDaemonStatePath();fs.writeFileSync(a,JSON.stringify(e,null,2))}function deleteUpgradeDaemonState(){try{const e=getUpgradeDaemonStatePath();fs.existsSync(e)&&fs.unlinkSync(e)}catch{}}function isProcessRunning(e){try{return process.kill(e,0),!0}catch{return!1}}function isUpgradeDaemonRunning(){const e=readUpgradeDaemonState();return!(!e||!isProcessRunning(e.pid)&&(deleteUpgradeDaemonState(),1))}function stopUpgradeDaemon(){const e=readUpgradeDaemonState();if(e)try{isProcessRunning(e.pid)&&process.kill(e.pid,"SIGTERM")}catch{}finally{deleteUpgradeDaemonState()}}async function checkAndUpgrade(){if(isAutoUpgradeDisabled())return!1;const e=await checkForUpgrades();return!(!e.hasUpgrade||!await performAutoUpgrade(e))&&(await stopDaemon(),await new Promise(e=>setTimeout(e,1e3)),spawnAgentrixCLI(["daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref(),!0)}async function runUpgradeDaemonLoop(){writeUpgradeDaemonState({pid:process.pid,startedAt:(new Date).toISOString()}),process.on("SIGTERM",()=>{deleteUpgradeDaemonState(),process.exit(0)}),process.on("SIGINT",()=>{deleteUpgradeDaemonState(),process.exit(0)});try{await checkAndUpgrade()}catch(e){}for(;;){await new Promise(e=>setTimeout(e,216e5));try{await checkAndUpgrade()}catch(e){}}}async function startUpgradeDaemon(){await runUpgradeDaemonLoop()}var upgradeDaemon=Object.freeze({__proto__:null,isUpgradeDaemonRunning:isUpgradeDaemonRunning,startUpgradeDaemon:startUpgradeDaemon,stopUpgradeDaemon:stopUpgradeDaemon});const cli=yargs(helpers.hideBin(process.argv)).scriptName("agentrix").version(_package.packageJson.version).usage("$0 <command> [options]").option("debug",{alias:"d",type:"boolean",describe:"Use local-debug mode (plaintext, for debugging)",global:!0}).help("help").alias("h","help").alias("v","version").strict().epilog("For more information, visit https://github.com/xmz-ai/agentrix-cli");_package.machine.getStatePaths,cli.command("upgrade","Upgrade CLI to the latest version",{},async e=>{console.log(chalk.dim(`Current version: ${_package.packageJson.version}`));const a=await checkIfDaemonRunningAndCleanupStaleState();if(await performAutoUpgrade()||process.exit(1),a){console.log(chalk.blue("Restarting daemon...")),await stopDaemon(),await new Promise(e=>setTimeout(e,1e3)),spawnAgentrixCLI(["daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref();let e=!1;for(let a=0;a<50;a++)if(await new Promise(e=>setTimeout(e,100)),await checkIfDaemonRunningAndCleanupStaleState()){e=!0;break}e?console.log(chalk.green("✓ Daemon restarted successfully")):console.log(chalk.yellow("⚠️ Daemon may still be starting. Run 'agentrix status' to check."))}try{const{version:e}=await Promise.resolve().then(function(){return require("./logger-CRZgrMLn.cjs")}).then(function(e){return e._package});console.log(chalk.green(`\n✓ Now running version: ${e}`))}catch{console.log(chalk.dim("\nRun 'agentrix --version' to see the new version"))}process.exit(0)}),cli.command("doctor","System diagnostics & troubleshooting",{},async e=>{await runDoctorCommand(),process.exit(0)}),cli.command("logout","Logout from Agentrix",{},async e=>{try{await handleAuthLogout()}catch(e){console.error(chalk.red("Error:"),e instanceof Error?e.message:"Unknown error"),process.env.DEBUG&&console.error(e),process.exit(1)}process.exit(0)}),cli.command("stop","Stop the daemon",{},async e=>{stopUpgradeDaemon(),await stopDaemon(),process.exit(0)}),cli.command("status","Show daemon and authentication status",{},async e=>{await runDoctorCommand("daemon"),console.log(""),await handleAuthStatus(),process.exit(0)}),cli.command("ls","List active sessions",{},async e=>{try{const e=await listDaemonSessions();0===e.length?console.log("No active sessions"):(console.log("Active sessions:"),console.log(JSON.stringify(e,null,2)))}catch(e){console.log("No daemon running")}process.exit(0)}),cli.command("killall","Clean up all runaway agentrix processes",{},async()=>{const e=await killRunawayAgentrixProcesses();console.log(`Cleaned up ${e.killed} runaway processes`),e.errors.length>0&&console.log("Errors:",e.errors),process.exit(0)}),cli.command("kill <sessionId>","Stop a specific session",e=>e.positional("sessionId",{type:"string",describe:"Session ID to stop"}),async e=>{try{const a=await stopDaemonSession(e.sessionId);console.log(a?chalk.green("✓ Session stopped"):chalk.red("Failed to stop session"))}catch(e){console.log(chalk.red("No daemon running"))}process.exit(0)}),cli.command("daemon",!1,{},async e=>{try{await authAndSetupMachineIfNeeded()}catch(e){console.error(chalk.red("Error:"),e instanceof Error?e.message:"Authentication failed"),process.env.DEBUG&&console.error(e),process.exit(1)}await startDaemon(),process.exit(0)}),cli.command("worker",!1,e=>e.option("type",{type:"string",choices:workerTypes,demandOption:!0,describe:"Worker type to start"}).option("started-by",{type:"string",choices:["daemon","terminal"],describe:"How the session was started"}).option("user-id",{type:"string",demandOption:!0,describe:"User ID for the worker"}).option("task-id",{type:"string",demandOption:!0,describe:"Task ID for the worker"}).option("idle-timeout",{type:"number",default:300,describe:"Idle timeout in seconds"}),async e=>{try{const a=e.type,n=workerRegistry[a];if(!n)throw new Error(`Unsupported worker type: ${String(e.type)}`);const t=e["started-by"],s=await authAndSetupMachineIfNeeded(),i=e["user-id"],o=e["task-id"],r=e["idle-timeout"];await n.run({credentials:s,startedBy:t,userId:i,taskId:o,idleTimeoutSecond:r})}catch(e){console.error(chalk.red("Error:"),e instanceof Error?e.message:"Unknown error"),process.env.DEBUG&&console.error(e),process.exit(1)}}),cli.command("upgrade-daemon",!1,{},async e=>{const{startUpgradeDaemon:a}=await Promise.resolve().then(function(){return upgradeDaemon});await a(),process.exit(0)}),cli.command("start","Start daemon (if not running) and show status",{},async e=>{try{await authAndSetupMachineIfNeeded()}catch(e){console.error(chalk.red("Error:"),e instanceof Error?e.message:"Authentication failed"),process.env.DEBUG&&console.error(e),process.exit(1)}const a=checkCriticalDependencies();if(a.ok||(console.log(chalk.bold.red("\n⚠️ Missing Critical Dependencies")),console.log(chalk.yellow(`Cannot start daemon. Missing: ${a.missing.join(", ")}`)),console.log(chalk.blue('\nRun "agentrix doctor" for detailed dependency information and installation instructions.')),process.exit(1)),!await isLatestDaemonRunning()){console.log("Starting Agentrix background service..."),spawnAgentrixCLI(["daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref();let e=!1;for(let a=0;a<50;a++)if(await new Promise(e=>setTimeout(e,100)),await checkIfDaemonRunningAndCleanupStaleState()){e=!0;break}e?console.log(chalk.green("✓ Daemon started successfully")):console.log(chalk.yellow("⚠️ Daemon may still be starting..."))}if(isAutoUpgradeDisabled()){const e=await checkForUpgrades();e.hasUpgrade&&displayUpgradeNotification(e)}else isUpgradeDaemonRunning()||spawnAgentrixCLI(["upgrade-daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref();await runDoctorCommand("daemon"),process.exit(0)}),cli.demandCommand(1,"Please specify a command. Use --help to see available commands.").parse();
1
+ "use strict";var yargs=require("yargs"),helpers=require("yargs/helpers"),chalk=require("chalk"),shared=require("@agentrix/shared"),node_crypto=require("node:crypto"),axios=require("axios"),_package=require("./logger-BrStDlXM.cjs"),node_readline=require("node:readline"),fs=require("fs"),path=require("path"),os=require("node:os"),open=require("open"),socket_ioClient=require("socket.io-client"),node_events=require("node:events"),fs$1=require("node:fs"),path$1=require("node:path"),node_module=require("node:module"),child_process=require("child_process"),psList=require("ps-list"),spawn=require("cross-spawn"),platform_js=require("@xmz-ai/sandbox-runtime/dist/utils/platform.js"),fastify=require("fastify"),zod=require("zod"),fastifyTypeProviderZod=require("fastify-type-provider-zod"),node_child_process=require("node:child_process"),events=require("events"),Database=require("better-sqlite3"),url=require("url"),sandboxRuntime=require("@xmz-ai/sandbox-runtime"),promises=require("node:stream/promises"),claudeAgentSdk=require("@anthropic-ai/claude-agent-sdk"),simpleGit=require("simple-git"),node_util=require("node:util"),promises$1=require("node:fs/promises"),crypto$1=require("crypto"),codexSdk=require("@openai/codex-sdk");require("winston"),require("os");var _documentCurrentScript="undefined"!=typeof document?document.currentScript:null;function _interopNamespaceDefault(e){var a=Object.create(null);return e&&Object.keys(e).forEach(function(n){if("default"!==n){var t=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(a,n,t.get?t:{enumerable:!0,get:function(){return e[n]}})}}),a.default=e,Object.freeze(a)}var fs__namespace$1=_interopNamespaceDefault(fs),path__namespace$1=_interopNamespaceDefault(path),fs__namespace=_interopNamespaceDefault(fs$1),path__namespace=_interopNamespaceDefault(path$1);async function delay(e){return new Promise(a=>setTimeout(a,e))}async function daemonPost(e,a){const n=await _package.machine.readDaemonState();if(!n?.port){const e="No daemon running, no state file found";return _package.logger.debug(`[CONTROL CLIENT] ${e}`),{error:e}}try{const t=process.env.AGENTRIX_DAEMON_HTTP_TIMEOUT?parseInt(process.env.AGENTRIX_DAEMON_HTTP_TIMEOUT):1e4,s=await fetch(`http://agentrix-local.xmz.ai:${n.port}${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a||{}),signal:AbortSignal.timeout(t)});if(!s.ok){const a=`Request failed: ${e}, HTTP ${s.status}`;return _package.logger.debug(`[CONTROL CLIENT] ${a}`),{error:a}}return await s.json()}catch(a){const n=`Request failed: ${e}, ${a instanceof Error?a.message:"Unknown error"}`;return _package.logger.debug(`[CONTROL CLIENT] ${n}`),{error:n}}}async function notifyDaemonSessionStarted(e,a){return await daemonPost("/session-started",{sessionId:e,metadata:a})}async function listDaemonSessions(){return(await daemonPost("/list")).children||[]}async function stopDaemonSession(e){return(await daemonPost("/stop-session",{sessionId:e})).success||!1}async function stopDaemonHttp(){await daemonPost("/stop")}async function checkIfDaemonRunningAndCleanupStaleState(){const e=await _package.machine.readDaemonState();if(!e)return!1;try{return process.kill(e.pid,0),!0}catch{return _package.logger.debug("[DAEMON RUN] Daemon PID not running, cleaning up state"),await cleanupDaemonState(),!1}}async function isLatestDaemonRunning(){if(_package.logger.debug("[DAEMON CONTROL] Checking if daemon is running same version"),!await checkIfDaemonRunningAndCleanupStaleState())return _package.logger.debug("[DAEMON CONTROL] No daemon running, returning false"),!1;const e=await _package.machine.readDaemonState();if(!e)return _package.logger.debug("[DAEMON CONTROL] No daemon state found, returning false"),!1;try{const a=path.join(_package.projectPath(),"package.json"),n=JSON.parse(fs.readFileSync(a,"utf-8")).version;return _package.logger.debug(`[DAEMON CONTROL] Current CLI version: ${n}, Daemon started with version: ${e.cliVersion}`),n===e.cliVersion}catch(e){return _package.logger.debug("[DAEMON CONTROL] Error checking daemon version",e),!1}}async function cleanupDaemonState(){try{await _package.machine.clearDaemonState(),_package.logger.debug("[DAEMON RUN] Daemon state file removed")}catch(e){_package.logger.debug("[DAEMON RUN] Error cleaning up daemon metadata",e)}}async function stopDaemon(){try{const e=await _package.machine.readDaemonState();if(!e)return void _package.logger.debug("No daemon state found");_package.logger.debug(`Stopping daemon with PID ${e.pid}`);try{return await stopDaemonHttp(),void await waitForProcessDeath(e.pid,2e3)}catch(e){_package.logger.debug("HTTP stop failed, will force kill",e)}process.kill(e.pid,"SIGKILL")}catch(e){_package.logger.debug("Error stopping daemon",e)}}async function waitForProcessDeath(e,a){const n=Date.now();for(;Date.now()-n<a;)try{process.kill(e,0),await new Promise(e=>setTimeout(e,100))}catch{return}throw new Error("Process did not die within timeout")}function generateWebAuthUrl(e,a){const n={key:shared.encodeBase64(e,"base64"),machineId:a},t=JSON.stringify(n),s=shared.encodeBase64((new TextEncoder).encode(t),"base64url");return`${_package.machine.webappUrl}/terminal/connect?auth=${s}`}async function handleAuthLogout(){if(!await _package.machine.readCredentials())return void console.log(chalk.yellow("Not currently authenticated"));console.log(chalk.blue("This will log you out of Agentrix")),console.log(chalk.yellow("⚠️ You will need to re-authenticate to use Agentrix again"));const e=node_readline.createInterface({input:process.stdin,output:process.stdout}),a=await new Promise(a=>{e.question(chalk.yellow("Are you sure you want to log out? (y/N): "),a)});if(e.close(),"y"===a.toLowerCase()||"yes"===a.toLowerCase())try{try{await stopDaemon(),console.log(chalk.gray("Stopped daemon"))}catch{}await _package.machine.clearCredentials(),console.log(chalk.gray("Removed credentials")),console.log(chalk.green("✓ Successfully logged out"))}catch(e){throw new Error(`Failed to logout: ${e instanceof Error?e.message:"Unknown error"}`)}else console.log(chalk.blue("Logout cancelled"))}async function handleAuthStatus(){const e=await _package.machine.readCredentials();if(console.log(chalk.bold("\nAuthentication Status\n")),!e)return void console.log(chalk.red("✗ Not authenticated"));console.log(chalk.green("✓ Authenticated"));const a=e.token.substring(0,30)+"...";console.log(chalk.gray(` Token: ${a}`)),e.machineId?(console.log(chalk.green("✓ Machine registered")),console.log(chalk.gray(` Machine ID: ${e.machineId}`)),console.log(chalk.gray(` Host: ${os.hostname()}`))):console.log(chalk.yellow("⚠️ Machine not registered")),console.log(chalk.gray(`\n Data directory: ${_package.machine.agentrixHomeDir}`));try{await checkIfDaemonRunningAndCleanupStaleState()?console.log(chalk.green("✓ Daemon running")):console.log(chalk.gray("✗ Daemon not running"))}catch{console.log(chalk.gray("✗ Daemon not running"))}}async function openBrowser(e){try{return!process.stdout.isTTY||process.env.CI||process.env.HEADLESS?(_package.logger.debug("[browser] Headless environment detected, skipping browser open"),!1):(_package.logger.debug(`[browser] Attempting to open URL: ${e}`),await open(e),_package.logger.debug("[browser] Browser opened successfully"),!0)}catch(e){return _package.logger.debug("[browser] Failed to open browser:",e),!1}}async function doAuth(){console.clear();const e=_package.machine.generateMachineId(),a=new Uint8Array(node_crypto.randomBytes(32)),n=await shared.createKeyPairWithUit8Array(a);try{console.log(`[AUTH] Sending auth request to: ${_package.machine.serverUrl}/v1/auth/machine`),console.log(`[AUTH] Public key: ${shared.encodeBase64(n.publicKey).substring(0,20)}...`);const a={machineId:e};await axios.post(`${_package.machine.serverUrl}/v1/auth/machine`,a),console.log("[AUTH] Auth request sent successfully")}catch(e){return console.log("Failed to create authentication request, please try again later."),{credentials:null,userPublicKey:null,keypair:n}}const t=await doWebAuth(n,e);return t.token?{credentials:{token:t.token,secret:shared.encodeBase64(a),machineId:e},userPublicKey:t?.userPublicKey,keypair:n}:{credentials:null,userPublicKey:null,keypair:n}}async function doWebAuth(e,a){console.clear(),console.log("\nWeb Authentication\n");const n=generateWebAuthUrl(e.publicKey,a);return console.log("Opening your browser..."),await openBrowser(n)?(console.log("✓ Browser opened\n"),console.log("Complete authentication in your browser window.")):console.log("Could not open browser automatically."),console.log("\nIf the browser did not open, please copy and paste this URL:"),console.log(n),console.log(""),await waitForAuthentication(e,a)}async function waitForAuthentication(e,a){process.stdout.write("Waiting for authentication");let n=0,t=!1;const s=()=>{t=!0,console.log("\n\nAuthentication cancelled."),process.exit(0)};process.on("SIGINT",s);try{for(;!t;){try{const n=await axios.get(`${_package.machine.serverUrl}/v1/auth/machine?machineId=${a}`);if("authorized"===n.data.state){const a=n.data.token,t=n.data.content,s=shared.decryptWithEphemeralKey(shared.decodeBase64(t),e.secretKey);return s?{token:a,userPublicKey:JSON.parse((new TextDecoder).decode(s)).publicKey}:(console.log("\n\nFailed to decrypt authentication data. Please try again."),{token:null,userPublicKey:null})}}catch(e){return console.log("\n\nFailed to check authentication status. Please try again."),{token:null,userPublicKey:null}}process.stdout.write("\rWaiting for authentication"+".".repeat(n%3+1)+" "),n++,await delay(1e3)}}finally{process.off("SIGINT",s)}return{token:null,userPublicKey:null}}async function syncMachine(e,a,n,t){try{const s={id:e.machineId,metadata:JSON.stringify(a)};t&&n&&(s.dataEncryptionKey=shared.encryptMachineEncryptionKey(t.publicKey,shared.generateAESKey(),shared.decodeBase64(n))),await axios.post(`${_package.machine.serverUrl}/v1/machines/sync`,s,{headers:{Authorization:`Bearer ${e.token}`,"Content-Type":"application/json"},timeout:6e4})}catch(e){if(axios.isAxiosError(e))throw new Error(`Failed to sync machine data: ${e.response?.data?.message||e.message}`);throw e}}async function authAndSetupMachineIfNeeded(){const e=await _package.machine.readCredentials();if(e)return _package.logger.info("[AUTH] Using existing credentials"),e;const a=process.env.CLOUD_AUTH_TOKEN,n=process.env.CLOUD_DEVICE;let t,s,i;if(a&&n)t={token:a,machineId:n},_package.logger.info("[AUTH] Cloud mode detected, using CLOUD_AUTH_TOKEN");else{const e=await doAuth();if(!e.credentials||!e.userPublicKey)throw new Error("Authentication failed or was cancelled");t=e.credentials,s=e.keypair,i=e.userPublicKey}return await _package.machine.writeCredentials(t),await syncMachine(t,_package.machine.metadata(),i,s),_package.logger.info("[AUTH] Machine setup completed"),t}class KeepAliveManager{interval=null;socket=null;config;constructor(e){this.config=e}start(e){this.interval&&this.stop(),this.socket=e,this.interval=setInterval(()=>{if(!this.socket)return void this.stop();const e=this.config.payloadGenerator?this.config.payloadGenerator():{};this.socket.emit(this.config.event,e)},this.config.intervalMs)}stop(){this.interval&&(clearInterval(this.interval),this.interval=null),this.socket=null}isRunning(){return null!==this.interval}}class SocketClient{socket=null;config;eventHandlers=new Map;eventEmitter=new node_events.EventEmitter;KeepAliveManager=null;healthCheckInterval=null;constructor(e){this.config=e,e.keepAliveConfig&&(this.KeepAliveManager=new KeepAliveManager(e.keepAliveConfig))}connect(){if(this.socket)return void this.log("Already connected or connecting");const{serverUrl:e,path:a,auth:n={},options:t={}}=this.config,s={path:a,auth:n,transports:["websocket"],reconnection:!0,reconnectionDelay:1e3,reconnectionDelayMax:5e3,reconnectionAttempts:1/0,...t};this.socket=socket_ioClient.io(e,s),this.setupSocketHandlers(),this.log("Connecting to",e)}disconnect(){this.socket&&(this.log("Disconnecting"),this.stopHealthCheck(),this.socket.close(),this.socket=null)}get connected(){return this.socket?.connected??!1}replaceSocketHandler(e,a,n){this.socket&&(a&&this.socket.off(e,a),this.socket.on(e,n))}onEvent(e,a){const n=async n=>(this.log(`received event ${e}, data: ${JSON.stringify(n)}`),a(n)),t=this.eventHandlers.get(e);this.eventHandlers.set(e,n),this.replaceSocketHandler(e,t,n)}onEventWithAck(e,a){const n=async(n,t)=>(this.log(`received event with ack ${e}, data: ${JSON.stringify(n)}`),a(n,t)),t=this.eventHandlers.get(e);this.eventHandlers.set(e,n),this.replaceSocketHandler(e,t,n)}unregisterHandler(e){this.eventHandlers.delete(e),this.socket&&this.socket.off(e)}send(e,a){this.socket?(this.log(`send event ${e}`),void 0!==a?this.socket.emit(e,a):this.socket.emit(e)):this.log("Cannot send - socket not connected")}async sendWithAck(e,a){if(!this.socket)throw new Error("Cannot send - socket not connected");return this.log(`send event ${e}, data: ${JSON.stringify(a)}`),this.socket.emitWithAck(e,a)}sendVolatile(e,a){this.socket&&(void 0!==a?this.socket.volatile.emit(e,a):this.socket.volatile.emit(e))}async flush(e=1e4){if(this.connected)return new Promise(a=>{const n=setTimeout(()=>a(),e);this.socket.emit("ping",()=>{clearTimeout(n),a()})})}updateAuth(e){this.socket&&(this.socket.auth=e),this.config.auth=e}onLifecycle(e,a){this.eventEmitter.on(`lifecycle:${e}`,a)}offLifecycle(e){this.eventEmitter.removeAllListeners(`lifecycle:${e}`)}setupSocketHandlers(){this.socket&&(this.socket.on("connect",()=>{this.log("Connected"),this.eventEmitter.emit("lifecycle:connect",this.socket);for(const[e,a]of this.eventHandlers.entries())this.socket.off(e,a),this.socket.on(e,a);this.KeepAliveManager?.start(this.socket),this.startHealthCheck()}),this.socket.on("disconnect",e=>{this.log("Disconnected:",e),this.eventEmitter.emit("lifecycle:disconnect",e),this.KeepAliveManager?.stop(),this.stopHealthCheck()}),this.socket.on("connect_error",e=>{this.log("Connection error:",e.message),this.eventEmitter.emit("lifecycle:connect_error",e),setTimeout(()=>this.socket?.connect(),5e3)}),this.socket.on("error",e=>{this.log("Socket error:",e),this.eventEmitter.emit("lifecycle:error",e)}))}startHealthCheck(){const e=this.config.healthCheckConfig;if(!1===e?.enabled)return;const a=e?.intervalMs??3e4,n=e?.timeoutMs??5e3;this.stopHealthCheck(),this.healthCheckInterval=setInterval(()=>{if(!this.socket||!this.connected)return;const e=setTimeout(()=>{this.log("Health check timeout - forcing reconnect"),this.socket&&(this.socket.disconnect(),this.socket.connect())},n);this.socket.once("pong",()=>{clearTimeout(e)}),this.socket.emit("ping")},a)}stopHealthCheck(){this.healthCheckInterval&&(clearInterval(this.healthCheckInterval),this.healthCheckInterval=null)}log(e,...a){this.config.logger&&this.config.logger(`[SocketClient] ${e}`,...a)}}function getAugmentedNamespace(e){if(Object.prototype.hasOwnProperty.call(e,"__esModule"))return e;var a=e.default;if("function"==typeof a){var n=function e(){var n=!1;try{n=this instanceof e}catch{}return n?Reflect.construct(a,arguments,this.constructor):a.apply(this,arguments)};n.prototype=a.prototype}else n={};return Object.defineProperty(n,"__esModule",{value:!0}),Object.keys(e).forEach(function(a){var t=Object.getOwnPropertyDescriptor(e,a);Object.defineProperty(n,a,t.get?t:{enumerable:!0,get:function(){return e[a]}})}),n}var mimeDb,hasRequiredMimeDb,mimeScore,hasRequiredMimeScore,hasRequiredMimeTypes,mimeTypes={},require$$0$1={"application/1d-interleaved-parityfec":{source:"iana"},"application/3gpdash-qoe-report+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/3gpp-ims+xml":{source:"iana",compressible:!0},"application/3gpphal+json":{source:"iana",compressible:!0},"application/3gpphalforms+json":{source:"iana",compressible:!0},"application/a2l":{source:"iana"},"application/ace+cbor":{source:"iana"},"application/ace+json":{source:"iana",compressible:!0},"application/ace-groupcomm+cbor":{source:"iana"},"application/ace-trl+cbor":{source:"iana"},"application/activemessage":{source:"iana"},"application/activity+json":{source:"iana",compressible:!0},"application/aif+cbor":{source:"iana"},"application/aif+json":{source:"iana",compressible:!0},"application/alto-cdni+json":{source:"iana",compressible:!0},"application/alto-cdnifilter+json":{source:"iana",compressible:!0},"application/alto-costmap+json":{source:"iana",compressible:!0},"application/alto-costmapfilter+json":{source:"iana",compressible:!0},"application/alto-directory+json":{source:"iana",compressible:!0},"application/alto-endpointcost+json":{source:"iana",compressible:!0},"application/alto-endpointcostparams+json":{source:"iana",compressible:!0},"application/alto-endpointprop+json":{source:"iana",compressible:!0},"application/alto-endpointpropparams+json":{source:"iana",compressible:!0},"application/alto-error+json":{source:"iana",compressible:!0},"application/alto-networkmap+json":{source:"iana",compressible:!0},"application/alto-networkmapfilter+json":{source:"iana",compressible:!0},"application/alto-propmap+json":{source:"iana",compressible:!0},"application/alto-propmapparams+json":{source:"iana",compressible:!0},"application/alto-tips+json":{source:"iana",compressible:!0},"application/alto-tipsparams+json":{source:"iana",compressible:!0},"application/alto-updatestreamcontrol+json":{source:"iana",compressible:!0},"application/alto-updatestreamparams+json":{source:"iana",compressible:!0},"application/aml":{source:"iana"},"application/andrew-inset":{source:"iana",extensions:["ez"]},"application/appinstaller":{compressible:!1,extensions:["appinstaller"]},"application/applefile":{source:"iana"},"application/applixware":{source:"apache",extensions:["aw"]},"application/appx":{compressible:!1,extensions:["appx"]},"application/appxbundle":{compressible:!1,extensions:["appxbundle"]},"application/at+jwt":{source:"iana"},"application/atf":{source:"iana"},"application/atfx":{source:"iana"},"application/atom+xml":{source:"iana",compressible:!0,extensions:["atom"]},"application/atomcat+xml":{source:"iana",compressible:!0,extensions:["atomcat"]},"application/atomdeleted+xml":{source:"iana",compressible:!0,extensions:["atomdeleted"]},"application/atomicmail":{source:"iana"},"application/atomsvc+xml":{source:"iana",compressible:!0,extensions:["atomsvc"]},"application/atsc-dwd+xml":{source:"iana",compressible:!0,extensions:["dwd"]},"application/atsc-dynamic-event-message":{source:"iana"},"application/atsc-held+xml":{source:"iana",compressible:!0,extensions:["held"]},"application/atsc-rdt+json":{source:"iana",compressible:!0},"application/atsc-rsat+xml":{source:"iana",compressible:!0,extensions:["rsat"]},"application/atxml":{source:"iana"},"application/auth-policy+xml":{source:"iana",compressible:!0},"application/automationml-aml+xml":{source:"iana",compressible:!0,extensions:["aml"]},"application/automationml-amlx+zip":{source:"iana",compressible:!1,extensions:["amlx"]},"application/bacnet-xdd+zip":{source:"iana",compressible:!1},"application/batch-smtp":{source:"iana"},"application/bdoc":{compressible:!1,extensions:["bdoc"]},"application/beep+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/bufr":{source:"iana"},"application/c2pa":{source:"iana"},"application/calendar+json":{source:"iana",compressible:!0},"application/calendar+xml":{source:"iana",compressible:!0,extensions:["xcs"]},"application/call-completion":{source:"iana"},"application/cals-1840":{source:"iana"},"application/captive+json":{source:"iana",compressible:!0},"application/cbor":{source:"iana"},"application/cbor-seq":{source:"iana"},"application/cccex":{source:"iana"},"application/ccmp+xml":{source:"iana",compressible:!0},"application/ccxml+xml":{source:"iana",compressible:!0,extensions:["ccxml"]},"application/cda+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/cdfx+xml":{source:"iana",compressible:!0,extensions:["cdfx"]},"application/cdmi-capability":{source:"iana",extensions:["cdmia"]},"application/cdmi-container":{source:"iana",extensions:["cdmic"]},"application/cdmi-domain":{source:"iana",extensions:["cdmid"]},"application/cdmi-object":{source:"iana",extensions:["cdmio"]},"application/cdmi-queue":{source:"iana",extensions:["cdmiq"]},"application/cdni":{source:"iana"},"application/ce+cbor":{source:"iana"},"application/cea":{source:"iana"},"application/cea-2018+xml":{source:"iana",compressible:!0},"application/cellml+xml":{source:"iana",compressible:!0},"application/cfw":{source:"iana"},"application/cid-edhoc+cbor-seq":{source:"iana"},"application/city+json":{source:"iana",compressible:!0},"application/city+json-seq":{source:"iana"},"application/clr":{source:"iana"},"application/clue+xml":{source:"iana",compressible:!0},"application/clue_info+xml":{source:"iana",compressible:!0},"application/cms":{source:"iana"},"application/cnrp+xml":{source:"iana",compressible:!0},"application/coap-eap":{source:"iana"},"application/coap-group+json":{source:"iana",compressible:!0},"application/coap-payload":{source:"iana"},"application/commonground":{source:"iana"},"application/concise-problem-details+cbor":{source:"iana"},"application/conference-info+xml":{source:"iana",compressible:!0},"application/cose":{source:"iana"},"application/cose-key":{source:"iana"},"application/cose-key-set":{source:"iana"},"application/cose-x509":{source:"iana"},"application/cpl+xml":{source:"iana",compressible:!0,extensions:["cpl"]},"application/csrattrs":{source:"iana"},"application/csta+xml":{source:"iana",compressible:!0},"application/cstadata+xml":{source:"iana",compressible:!0},"application/csvm+json":{source:"iana",compressible:!0},"application/cu-seeme":{source:"apache",extensions:["cu"]},"application/cwl":{source:"iana",extensions:["cwl"]},"application/cwl+json":{source:"iana",compressible:!0},"application/cwl+yaml":{source:"iana"},"application/cwt":{source:"iana"},"application/cybercash":{source:"iana"},"application/dart":{compressible:!0},"application/dash+xml":{source:"iana",compressible:!0,extensions:["mpd"]},"application/dash-patch+xml":{source:"iana",compressible:!0,extensions:["mpp"]},"application/dashdelta":{source:"iana"},"application/davmount+xml":{source:"iana",compressible:!0,extensions:["davmount"]},"application/dca-rft":{source:"iana"},"application/dcd":{source:"iana"},"application/dec-dx":{source:"iana"},"application/dialog-info+xml":{source:"iana",compressible:!0},"application/dicom":{source:"iana",extensions:["dcm"]},"application/dicom+json":{source:"iana",compressible:!0},"application/dicom+xml":{source:"iana",compressible:!0},"application/dii":{source:"iana"},"application/dit":{source:"iana"},"application/dns":{source:"iana"},"application/dns+json":{source:"iana",compressible:!0},"application/dns-message":{source:"iana"},"application/docbook+xml":{source:"apache",compressible:!0,extensions:["dbk"]},"application/dots+cbor":{source:"iana"},"application/dpop+jwt":{source:"iana"},"application/dskpp+xml":{source:"iana",compressible:!0},"application/dssc+der":{source:"iana",extensions:["dssc"]},"application/dssc+xml":{source:"iana",compressible:!0,extensions:["xdssc"]},"application/dvcs":{source:"iana"},"application/eat+cwt":{source:"iana"},"application/eat+jwt":{source:"iana"},"application/eat-bun+cbor":{source:"iana"},"application/eat-bun+json":{source:"iana",compressible:!0},"application/eat-ucs+cbor":{source:"iana"},"application/eat-ucs+json":{source:"iana",compressible:!0},"application/ecmascript":{source:"apache",compressible:!0,extensions:["ecma"]},"application/edhoc+cbor-seq":{source:"iana"},"application/edi-consent":{source:"iana"},"application/edi-x12":{source:"iana",compressible:!1},"application/edifact":{source:"iana",compressible:!1},"application/efi":{source:"iana"},"application/elm+json":{source:"iana",charset:"UTF-8",compressible:!0},"application/elm+xml":{source:"iana",compressible:!0},"application/emergencycalldata.cap+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/emergencycalldata.comment+xml":{source:"iana",compressible:!0},"application/emergencycalldata.control+xml":{source:"iana",compressible:!0},"application/emergencycalldata.deviceinfo+xml":{source:"iana",compressible:!0},"application/emergencycalldata.ecall.msd":{source:"iana"},"application/emergencycalldata.legacyesn+json":{source:"iana",compressible:!0},"application/emergencycalldata.providerinfo+xml":{source:"iana",compressible:!0},"application/emergencycalldata.serviceinfo+xml":{source:"iana",compressible:!0},"application/emergencycalldata.subscriberinfo+xml":{source:"iana",compressible:!0},"application/emergencycalldata.veds+xml":{source:"iana",compressible:!0},"application/emma+xml":{source:"iana",compressible:!0,extensions:["emma"]},"application/emotionml+xml":{source:"iana",compressible:!0,extensions:["emotionml"]},"application/encaprtp":{source:"iana"},"application/entity-statement+jwt":{source:"iana"},"application/epp+xml":{source:"iana",compressible:!0},"application/epub+zip":{source:"iana",compressible:!1,extensions:["epub"]},"application/eshop":{source:"iana"},"application/exi":{source:"iana",extensions:["exi"]},"application/expect-ct-report+json":{source:"iana",compressible:!0},"application/express":{source:"iana",extensions:["exp"]},"application/fastinfoset":{source:"iana"},"application/fastsoap":{source:"iana"},"application/fdf":{source:"iana",extensions:["fdf"]},"application/fdt+xml":{source:"iana",compressible:!0,extensions:["fdt"]},"application/fhir+json":{source:"iana",charset:"UTF-8",compressible:!0},"application/fhir+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/fido.trusted-apps+json":{compressible:!0},"application/fits":{source:"iana"},"application/flexfec":{source:"iana"},"application/font-sfnt":{source:"iana"},"application/font-tdpfr":{source:"iana",extensions:["pfr"]},"application/font-woff":{source:"iana",compressible:!1},"application/framework-attributes+xml":{source:"iana",compressible:!0},"application/geo+json":{source:"iana",compressible:!0,extensions:["geojson"]},"application/geo+json-seq":{source:"iana"},"application/geopackage+sqlite3":{source:"iana"},"application/geopose+json":{source:"iana",compressible:!0},"application/geoxacml+json":{source:"iana",compressible:!0},"application/geoxacml+xml":{source:"iana",compressible:!0},"application/gltf-buffer":{source:"iana"},"application/gml+xml":{source:"iana",compressible:!0,extensions:["gml"]},"application/gnap-binding-jws":{source:"iana"},"application/gnap-binding-jwsd":{source:"iana"},"application/gnap-binding-rotation-jws":{source:"iana"},"application/gnap-binding-rotation-jwsd":{source:"iana"},"application/gpx+xml":{source:"apache",compressible:!0,extensions:["gpx"]},"application/grib":{source:"iana"},"application/gxf":{source:"apache",extensions:["gxf"]},"application/gzip":{source:"iana",compressible:!1,extensions:["gz"]},"application/h224":{source:"iana"},"application/held+xml":{source:"iana",compressible:!0},"application/hjson":{extensions:["hjson"]},"application/hl7v2+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/http":{source:"iana"},"application/hyperstudio":{source:"iana",extensions:["stk"]},"application/ibe-key-request+xml":{source:"iana",compressible:!0},"application/ibe-pkg-reply+xml":{source:"iana",compressible:!0},"application/ibe-pp-data":{source:"iana"},"application/iges":{source:"iana"},"application/im-iscomposing+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/index":{source:"iana"},"application/index.cmd":{source:"iana"},"application/index.obj":{source:"iana"},"application/index.response":{source:"iana"},"application/index.vnd":{source:"iana"},"application/inkml+xml":{source:"iana",compressible:!0,extensions:["ink","inkml"]},"application/iotp":{source:"iana"},"application/ipfix":{source:"iana",extensions:["ipfix"]},"application/ipp":{source:"iana"},"application/isup":{source:"iana"},"application/its+xml":{source:"iana",compressible:!0,extensions:["its"]},"application/java-archive":{source:"iana",compressible:!1,extensions:["jar","war","ear"]},"application/java-serialized-object":{source:"apache",compressible:!1,extensions:["ser"]},"application/java-vm":{source:"apache",compressible:!1,extensions:["class"]},"application/javascript":{source:"apache",charset:"UTF-8",compressible:!0,extensions:["js"]},"application/jf2feed+json":{source:"iana",compressible:!0},"application/jose":{source:"iana"},"application/jose+json":{source:"iana",compressible:!0},"application/jrd+json":{source:"iana",compressible:!0},"application/jscalendar+json":{source:"iana",compressible:!0},"application/jscontact+json":{source:"iana",compressible:!0},"application/json":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["json","map"]},"application/json-patch+json":{source:"iana",compressible:!0},"application/json-seq":{source:"iana"},"application/json5":{extensions:["json5"]},"application/jsonml+json":{source:"apache",compressible:!0,extensions:["jsonml"]},"application/jsonpath":{source:"iana"},"application/jwk+json":{source:"iana",compressible:!0},"application/jwk-set+json":{source:"iana",compressible:!0},"application/jwk-set+jwt":{source:"iana"},"application/jwt":{source:"iana"},"application/kpml-request+xml":{source:"iana",compressible:!0},"application/kpml-response+xml":{source:"iana",compressible:!0},"application/ld+json":{source:"iana",compressible:!0,extensions:["jsonld"]},"application/lgr+xml":{source:"iana",compressible:!0,extensions:["lgr"]},"application/link-format":{source:"iana"},"application/linkset":{source:"iana"},"application/linkset+json":{source:"iana",compressible:!0},"application/load-control+xml":{source:"iana",compressible:!0},"application/logout+jwt":{source:"iana"},"application/lost+xml":{source:"iana",compressible:!0,extensions:["lostxml"]},"application/lostsync+xml":{source:"iana",compressible:!0},"application/lpf+zip":{source:"iana",compressible:!1},"application/lxf":{source:"iana"},"application/mac-binhex40":{source:"iana",extensions:["hqx"]},"application/mac-compactpro":{source:"apache",extensions:["cpt"]},"application/macwriteii":{source:"iana"},"application/mads+xml":{source:"iana",compressible:!0,extensions:["mads"]},"application/manifest+json":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["webmanifest"]},"application/marc":{source:"iana",extensions:["mrc"]},"application/marcxml+xml":{source:"iana",compressible:!0,extensions:["mrcx"]},"application/mathematica":{source:"iana",extensions:["ma","nb","mb"]},"application/mathml+xml":{source:"iana",compressible:!0,extensions:["mathml"]},"application/mathml-content+xml":{source:"iana",compressible:!0},"application/mathml-presentation+xml":{source:"iana",compressible:!0},"application/mbms-associated-procedure-description+xml":{source:"iana",compressible:!0},"application/mbms-deregister+xml":{source:"iana",compressible:!0},"application/mbms-envelope+xml":{source:"iana",compressible:!0},"application/mbms-msk+xml":{source:"iana",compressible:!0},"application/mbms-msk-response+xml":{source:"iana",compressible:!0},"application/mbms-protection-description+xml":{source:"iana",compressible:!0},"application/mbms-reception-report+xml":{source:"iana",compressible:!0},"application/mbms-register+xml":{source:"iana",compressible:!0},"application/mbms-register-response+xml":{source:"iana",compressible:!0},"application/mbms-schedule+xml":{source:"iana",compressible:!0},"application/mbms-user-service-description+xml":{source:"iana",compressible:!0},"application/mbox":{source:"iana",extensions:["mbox"]},"application/media-policy-dataset+xml":{source:"iana",compressible:!0,extensions:["mpf"]},"application/media_control+xml":{source:"iana",compressible:!0},"application/mediaservercontrol+xml":{source:"iana",compressible:!0,extensions:["mscml"]},"application/merge-patch+json":{source:"iana",compressible:!0},"application/metalink+xml":{source:"apache",compressible:!0,extensions:["metalink"]},"application/metalink4+xml":{source:"iana",compressible:!0,extensions:["meta4"]},"application/mets+xml":{source:"iana",compressible:!0,extensions:["mets"]},"application/mf4":{source:"iana"},"application/mikey":{source:"iana"},"application/mipc":{source:"iana"},"application/missing-blocks+cbor-seq":{source:"iana"},"application/mmt-aei+xml":{source:"iana",compressible:!0,extensions:["maei"]},"application/mmt-usd+xml":{source:"iana",compressible:!0,extensions:["musd"]},"application/mods+xml":{source:"iana",compressible:!0,extensions:["mods"]},"application/moss-keys":{source:"iana"},"application/moss-signature":{source:"iana"},"application/mosskey-data":{source:"iana"},"application/mosskey-request":{source:"iana"},"application/mp21":{source:"iana",extensions:["m21","mp21"]},"application/mp4":{source:"iana",extensions:["mp4","mpg4","mp4s","m4p"]},"application/mpeg4-generic":{source:"iana"},"application/mpeg4-iod":{source:"iana"},"application/mpeg4-iod-xmt":{source:"iana"},"application/mrb-consumer+xml":{source:"iana",compressible:!0},"application/mrb-publish+xml":{source:"iana",compressible:!0},"application/msc-ivr+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/msc-mixer+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/msix":{compressible:!1,extensions:["msix"]},"application/msixbundle":{compressible:!1,extensions:["msixbundle"]},"application/msword":{source:"iana",compressible:!1,extensions:["doc","dot"]},"application/mud+json":{source:"iana",compressible:!0},"application/multipart-core":{source:"iana"},"application/mxf":{source:"iana",extensions:["mxf"]},"application/n-quads":{source:"iana",extensions:["nq"]},"application/n-triples":{source:"iana",extensions:["nt"]},"application/nasdata":{source:"iana"},"application/news-checkgroups":{source:"iana",charset:"US-ASCII"},"application/news-groupinfo":{source:"iana",charset:"US-ASCII"},"application/news-transmission":{source:"iana"},"application/nlsml+xml":{source:"iana",compressible:!0},"application/node":{source:"iana",extensions:["cjs"]},"application/nss":{source:"iana"},"application/oauth-authz-req+jwt":{source:"iana"},"application/oblivious-dns-message":{source:"iana"},"application/ocsp-request":{source:"iana"},"application/ocsp-response":{source:"iana"},"application/octet-stream":{source:"iana",compressible:!0,extensions:["bin","dms","lrf","mar","so","dist","distz","pkg","bpk","dump","elc","deploy","exe","dll","deb","dmg","iso","img","msi","msp","msm","buffer"]},"application/oda":{source:"iana",extensions:["oda"]},"application/odm+xml":{source:"iana",compressible:!0},"application/odx":{source:"iana"},"application/oebps-package+xml":{source:"iana",compressible:!0,extensions:["opf"]},"application/ogg":{source:"iana",compressible:!1,extensions:["ogx"]},"application/ohttp-keys":{source:"iana"},"application/omdoc+xml":{source:"apache",compressible:!0,extensions:["omdoc"]},"application/onenote":{source:"apache",extensions:["onetoc","onetoc2","onetmp","onepkg","one","onea"]},"application/opc-nodeset+xml":{source:"iana",compressible:!0},"application/oscore":{source:"iana"},"application/oxps":{source:"iana",extensions:["oxps"]},"application/p21":{source:"iana"},"application/p21+zip":{source:"iana",compressible:!1},"application/p2p-overlay+xml":{source:"iana",compressible:!0,extensions:["relo"]},"application/parityfec":{source:"iana"},"application/passport":{source:"iana"},"application/patch-ops-error+xml":{source:"iana",compressible:!0,extensions:["xer"]},"application/pdf":{source:"iana",compressible:!1,extensions:["pdf"]},"application/pdx":{source:"iana"},"application/pem-certificate-chain":{source:"iana"},"application/pgp-encrypted":{source:"iana",compressible:!1,extensions:["pgp"]},"application/pgp-keys":{source:"iana",extensions:["asc"]},"application/pgp-signature":{source:"iana",extensions:["sig","asc"]},"application/pics-rules":{source:"apache",extensions:["prf"]},"application/pidf+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/pidf-diff+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/pkcs10":{source:"iana",extensions:["p10"]},"application/pkcs12":{source:"iana"},"application/pkcs7-mime":{source:"iana",extensions:["p7m","p7c"]},"application/pkcs7-signature":{source:"iana",extensions:["p7s"]},"application/pkcs8":{source:"iana",extensions:["p8"]},"application/pkcs8-encrypted":{source:"iana"},"application/pkix-attr-cert":{source:"iana",extensions:["ac"]},"application/pkix-cert":{source:"iana",extensions:["cer"]},"application/pkix-crl":{source:"iana",extensions:["crl"]},"application/pkix-pkipath":{source:"iana",extensions:["pkipath"]},"application/pkixcmp":{source:"iana",extensions:["pki"]},"application/pls+xml":{source:"iana",compressible:!0,extensions:["pls"]},"application/poc-settings+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/postscript":{source:"iana",compressible:!0,extensions:["ai","eps","ps"]},"application/ppsp-tracker+json":{source:"iana",compressible:!0},"application/private-token-issuer-directory":{source:"iana"},"application/private-token-request":{source:"iana"},"application/private-token-response":{source:"iana"},"application/problem+json":{source:"iana",compressible:!0},"application/problem+xml":{source:"iana",compressible:!0},"application/provenance+xml":{source:"iana",compressible:!0,extensions:["provx"]},"application/provided-claims+jwt":{source:"iana"},"application/prs.alvestrand.titrax-sheet":{source:"iana"},"application/prs.cww":{source:"iana",extensions:["cww"]},"application/prs.cyn":{source:"iana",charset:"7-BIT"},"application/prs.hpub+zip":{source:"iana",compressible:!1},"application/prs.implied-document+xml":{source:"iana",compressible:!0},"application/prs.implied-executable":{source:"iana"},"application/prs.implied-object+json":{source:"iana",compressible:!0},"application/prs.implied-object+json-seq":{source:"iana"},"application/prs.implied-object+yaml":{source:"iana"},"application/prs.implied-structure":{source:"iana"},"application/prs.mayfile":{source:"iana"},"application/prs.nprend":{source:"iana"},"application/prs.plucker":{source:"iana"},"application/prs.rdf-xml-crypt":{source:"iana"},"application/prs.vcfbzip2":{source:"iana"},"application/prs.xsf+xml":{source:"iana",compressible:!0,extensions:["xsf"]},"application/pskc+xml":{source:"iana",compressible:!0,extensions:["pskcxml"]},"application/pvd+json":{source:"iana",compressible:!0},"application/qsig":{source:"iana"},"application/raml+yaml":{compressible:!0,extensions:["raml"]},"application/raptorfec":{source:"iana"},"application/rdap+json":{source:"iana",compressible:!0},"application/rdf+xml":{source:"iana",compressible:!0,extensions:["rdf","owl"]},"application/reginfo+xml":{source:"iana",compressible:!0,extensions:["rif"]},"application/relax-ng-compact-syntax":{source:"iana",extensions:["rnc"]},"application/remote-printing":{source:"apache"},"application/reputon+json":{source:"iana",compressible:!0},"application/resolve-response+jwt":{source:"iana"},"application/resource-lists+xml":{source:"iana",compressible:!0,extensions:["rl"]},"application/resource-lists-diff+xml":{source:"iana",compressible:!0,extensions:["rld"]},"application/rfc+xml":{source:"iana",compressible:!0},"application/riscos":{source:"iana"},"application/rlmi+xml":{source:"iana",compressible:!0},"application/rls-services+xml":{source:"iana",compressible:!0,extensions:["rs"]},"application/route-apd+xml":{source:"iana",compressible:!0,extensions:["rapd"]},"application/route-s-tsid+xml":{source:"iana",compressible:!0,extensions:["sls"]},"application/route-usd+xml":{source:"iana",compressible:!0,extensions:["rusd"]},"application/rpki-checklist":{source:"iana"},"application/rpki-ghostbusters":{source:"iana",extensions:["gbr"]},"application/rpki-manifest":{source:"iana",extensions:["mft"]},"application/rpki-publication":{source:"iana"},"application/rpki-roa":{source:"iana",extensions:["roa"]},"application/rpki-signed-tal":{source:"iana"},"application/rpki-updown":{source:"iana"},"application/rsd+xml":{source:"apache",compressible:!0,extensions:["rsd"]},"application/rss+xml":{source:"apache",compressible:!0,extensions:["rss"]},"application/rtf":{source:"iana",compressible:!0,extensions:["rtf"]},"application/rtploopback":{source:"iana"},"application/rtx":{source:"iana"},"application/samlassertion+xml":{source:"iana",compressible:!0},"application/samlmetadata+xml":{source:"iana",compressible:!0},"application/sarif+json":{source:"iana",compressible:!0},"application/sarif-external-properties+json":{source:"iana",compressible:!0},"application/sbe":{source:"iana"},"application/sbml+xml":{source:"iana",compressible:!0,extensions:["sbml"]},"application/scaip+xml":{source:"iana",compressible:!0},"application/scim+json":{source:"iana",compressible:!0},"application/scvp-cv-request":{source:"iana",extensions:["scq"]},"application/scvp-cv-response":{source:"iana",extensions:["scs"]},"application/scvp-vp-request":{source:"iana",extensions:["spq"]},"application/scvp-vp-response":{source:"iana",extensions:["spp"]},"application/sdp":{source:"iana",extensions:["sdp"]},"application/secevent+jwt":{source:"iana"},"application/senml+cbor":{source:"iana"},"application/senml+json":{source:"iana",compressible:!0},"application/senml+xml":{source:"iana",compressible:!0,extensions:["senmlx"]},"application/senml-etch+cbor":{source:"iana"},"application/senml-etch+json":{source:"iana",compressible:!0},"application/senml-exi":{source:"iana"},"application/sensml+cbor":{source:"iana"},"application/sensml+json":{source:"iana",compressible:!0},"application/sensml+xml":{source:"iana",compressible:!0,extensions:["sensmlx"]},"application/sensml-exi":{source:"iana"},"application/sep+xml":{source:"iana",compressible:!0},"application/sep-exi":{source:"iana"},"application/session-info":{source:"iana"},"application/set-payment":{source:"iana"},"application/set-payment-initiation":{source:"iana",extensions:["setpay"]},"application/set-registration":{source:"iana"},"application/set-registration-initiation":{source:"iana",extensions:["setreg"]},"application/sgml":{source:"iana"},"application/sgml-open-catalog":{source:"iana"},"application/shf+xml":{source:"iana",compressible:!0,extensions:["shf"]},"application/sieve":{source:"iana",extensions:["siv","sieve"]},"application/simple-filter+xml":{source:"iana",compressible:!0},"application/simple-message-summary":{source:"iana"},"application/simplesymbolcontainer":{source:"iana"},"application/sipc":{source:"iana"},"application/slate":{source:"iana"},"application/smil":{source:"apache"},"application/smil+xml":{source:"iana",compressible:!0,extensions:["smi","smil"]},"application/smpte336m":{source:"iana"},"application/soap+fastinfoset":{source:"iana"},"application/soap+xml":{source:"iana",compressible:!0},"application/sparql-query":{source:"iana",extensions:["rq"]},"application/sparql-results+xml":{source:"iana",compressible:!0,extensions:["srx"]},"application/spdx+json":{source:"iana",compressible:!0},"application/spirits-event+xml":{source:"iana",compressible:!0},"application/sql":{source:"iana",extensions:["sql"]},"application/srgs":{source:"iana",extensions:["gram"]},"application/srgs+xml":{source:"iana",compressible:!0,extensions:["grxml"]},"application/sru+xml":{source:"iana",compressible:!0,extensions:["sru"]},"application/ssdl+xml":{source:"apache",compressible:!0,extensions:["ssdl"]},"application/sslkeylogfile":{source:"iana"},"application/ssml+xml":{source:"iana",compressible:!0,extensions:["ssml"]},"application/st2110-41":{source:"iana"},"application/stix+json":{source:"iana",compressible:!0},"application/stratum":{source:"iana"},"application/swid+cbor":{source:"iana"},"application/swid+xml":{source:"iana",compressible:!0,extensions:["swidtag"]},"application/tamp-apex-update":{source:"iana"},"application/tamp-apex-update-confirm":{source:"iana"},"application/tamp-community-update":{source:"iana"},"application/tamp-community-update-confirm":{source:"iana"},"application/tamp-error":{source:"iana"},"application/tamp-sequence-adjust":{source:"iana"},"application/tamp-sequence-adjust-confirm":{source:"iana"},"application/tamp-status-query":{source:"iana"},"application/tamp-status-response":{source:"iana"},"application/tamp-update":{source:"iana"},"application/tamp-update-confirm":{source:"iana"},"application/tar":{compressible:!0},"application/taxii+json":{source:"iana",compressible:!0},"application/td+json":{source:"iana",compressible:!0},"application/tei+xml":{source:"iana",compressible:!0,extensions:["tei","teicorpus"]},"application/tetra_isi":{source:"iana"},"application/thraud+xml":{source:"iana",compressible:!0,extensions:["tfi"]},"application/timestamp-query":{source:"iana"},"application/timestamp-reply":{source:"iana"},"application/timestamped-data":{source:"iana",extensions:["tsd"]},"application/tlsrpt+gzip":{source:"iana"},"application/tlsrpt+json":{source:"iana",compressible:!0},"application/tm+json":{source:"iana",compressible:!0},"application/tnauthlist":{source:"iana"},"application/toc+cbor":{source:"iana"},"application/token-introspection+jwt":{source:"iana"},"application/toml":{source:"iana",compressible:!0,extensions:["toml"]},"application/trickle-ice-sdpfrag":{source:"iana"},"application/trig":{source:"iana",extensions:["trig"]},"application/trust-chain+json":{source:"iana",compressible:!0},"application/trust-mark+jwt":{source:"iana"},"application/trust-mark-delegation+jwt":{source:"iana"},"application/ttml+xml":{source:"iana",compressible:!0,extensions:["ttml"]},"application/tve-trigger":{source:"iana"},"application/tzif":{source:"iana"},"application/tzif-leap":{source:"iana"},"application/ubjson":{compressible:!1,extensions:["ubj"]},"application/uccs+cbor":{source:"iana"},"application/ujcs+json":{source:"iana",compressible:!0},"application/ulpfec":{source:"iana"},"application/urc-grpsheet+xml":{source:"iana",compressible:!0},"application/urc-ressheet+xml":{source:"iana",compressible:!0,extensions:["rsheet"]},"application/urc-targetdesc+xml":{source:"iana",compressible:!0,extensions:["td"]},"application/urc-uisocketdesc+xml":{source:"iana",compressible:!0},"application/vc":{source:"iana"},"application/vc+cose":{source:"iana"},"application/vc+jwt":{source:"iana"},"application/vcard+json":{source:"iana",compressible:!0},"application/vcard+xml":{source:"iana",compressible:!0},"application/vemmi":{source:"iana"},"application/vividence.scriptfile":{source:"apache"},"application/vnd.1000minds.decision-model+xml":{source:"iana",compressible:!0,extensions:["1km"]},"application/vnd.1ob":{source:"iana"},"application/vnd.3gpp-prose+xml":{source:"iana",compressible:!0},"application/vnd.3gpp-prose-pc3a+xml":{source:"iana",compressible:!0},"application/vnd.3gpp-prose-pc3ach+xml":{source:"iana",compressible:!0},"application/vnd.3gpp-prose-pc3ch+xml":{source:"iana",compressible:!0},"application/vnd.3gpp-prose-pc8+xml":{source:"iana",compressible:!0},"application/vnd.3gpp-v2x-local-service-information":{source:"iana"},"application/vnd.3gpp.5gnas":{source:"iana"},"application/vnd.3gpp.5gsa2x":{source:"iana"},"application/vnd.3gpp.5gsa2x-local-service-information":{source:"iana"},"application/vnd.3gpp.5gsv2x":{source:"iana"},"application/vnd.3gpp.5gsv2x-local-service-information":{source:"iana"},"application/vnd.3gpp.access-transfer-events+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.bsf+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.crs+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.current-location-discovery+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.gmop+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.gtpc":{source:"iana"},"application/vnd.3gpp.interworking-data":{source:"iana"},"application/vnd.3gpp.lpp":{source:"iana"},"application/vnd.3gpp.mc-signalling-ear":{source:"iana"},"application/vnd.3gpp.mcdata-affiliation-command+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-msgstore-ctrl-request+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-payload":{source:"iana"},"application/vnd.3gpp.mcdata-regroup+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-service-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-signalling":{source:"iana"},"application/vnd.3gpp.mcdata-ue-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcdata-user-profile+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-affiliation-command+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-floor-request+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-location-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-mbms-usage-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-regroup+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-service-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-signed+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-ue-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-ue-init-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcptt-user-profile+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-affiliation-command+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-location-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-mbms-usage-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-regroup+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-service-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-transmission-request+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-ue-config+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mcvideo-user-profile+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.mid-call+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.ngap":{source:"iana"},"application/vnd.3gpp.pfcp":{source:"iana"},"application/vnd.3gpp.pic-bw-large":{source:"iana",extensions:["plb"]},"application/vnd.3gpp.pic-bw-small":{source:"iana",extensions:["psb"]},"application/vnd.3gpp.pic-bw-var":{source:"iana",extensions:["pvb"]},"application/vnd.3gpp.pinapp-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.s1ap":{source:"iana"},"application/vnd.3gpp.seal-group-doc+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-location-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-mbms-usage-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-network-qos-management-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-ue-config-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-unicast-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.seal-user-profile-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.sms":{source:"iana"},"application/vnd.3gpp.sms+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.srvcc-ext+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.srvcc-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.state-and-event-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.ussd+xml":{source:"iana",compressible:!0},"application/vnd.3gpp.v2x":{source:"iana"},"application/vnd.3gpp.vae-info+xml":{source:"iana",compressible:!0},"application/vnd.3gpp2.bcmcsinfo+xml":{source:"iana",compressible:!0},"application/vnd.3gpp2.sms":{source:"iana"},"application/vnd.3gpp2.tcap":{source:"iana",extensions:["tcap"]},"application/vnd.3lightssoftware.imagescal":{source:"iana"},"application/vnd.3m.post-it-notes":{source:"iana",extensions:["pwn"]},"application/vnd.accpac.simply.aso":{source:"iana",extensions:["aso"]},"application/vnd.accpac.simply.imp":{source:"iana",extensions:["imp"]},"application/vnd.acm.addressxfer+json":{source:"iana",compressible:!0},"application/vnd.acm.chatbot+json":{source:"iana",compressible:!0},"application/vnd.acucobol":{source:"iana",extensions:["acu"]},"application/vnd.acucorp":{source:"iana",extensions:["atc","acutc"]},"application/vnd.adobe.air-application-installer-package+zip":{source:"apache",compressible:!1,extensions:["air"]},"application/vnd.adobe.flash.movie":{source:"iana"},"application/vnd.adobe.formscentral.fcdt":{source:"iana",extensions:["fcdt"]},"application/vnd.adobe.fxp":{source:"iana",extensions:["fxp","fxpl"]},"application/vnd.adobe.partial-upload":{source:"iana"},"application/vnd.adobe.xdp+xml":{source:"iana",compressible:!0,extensions:["xdp"]},"application/vnd.adobe.xfdf":{source:"apache",extensions:["xfdf"]},"application/vnd.aether.imp":{source:"iana"},"application/vnd.afpc.afplinedata":{source:"iana"},"application/vnd.afpc.afplinedata-pagedef":{source:"iana"},"application/vnd.afpc.cmoca-cmresource":{source:"iana"},"application/vnd.afpc.foca-charset":{source:"iana"},"application/vnd.afpc.foca-codedfont":{source:"iana"},"application/vnd.afpc.foca-codepage":{source:"iana"},"application/vnd.afpc.modca":{source:"iana"},"application/vnd.afpc.modca-cmtable":{source:"iana"},"application/vnd.afpc.modca-formdef":{source:"iana"},"application/vnd.afpc.modca-mediummap":{source:"iana"},"application/vnd.afpc.modca-objectcontainer":{source:"iana"},"application/vnd.afpc.modca-overlay":{source:"iana"},"application/vnd.afpc.modca-pagesegment":{source:"iana"},"application/vnd.age":{source:"iana",extensions:["age"]},"application/vnd.ah-barcode":{source:"apache"},"application/vnd.ahead.space":{source:"iana",extensions:["ahead"]},"application/vnd.airzip.filesecure.azf":{source:"iana",extensions:["azf"]},"application/vnd.airzip.filesecure.azs":{source:"iana",extensions:["azs"]},"application/vnd.amadeus+json":{source:"iana",compressible:!0},"application/vnd.amazon.ebook":{source:"apache",extensions:["azw"]},"application/vnd.amazon.mobi8-ebook":{source:"iana"},"application/vnd.americandynamics.acc":{source:"iana",extensions:["acc"]},"application/vnd.amiga.ami":{source:"iana",extensions:["ami"]},"application/vnd.amundsen.maze+xml":{source:"iana",compressible:!0},"application/vnd.android.ota":{source:"iana"},"application/vnd.android.package-archive":{source:"apache",compressible:!1,extensions:["apk"]},"application/vnd.anki":{source:"iana"},"application/vnd.anser-web-certificate-issue-initiation":{source:"iana",extensions:["cii"]},"application/vnd.anser-web-funds-transfer-initiation":{source:"apache",extensions:["fti"]},"application/vnd.antix.game-component":{source:"iana",extensions:["atx"]},"application/vnd.apache.arrow.file":{source:"iana"},"application/vnd.apache.arrow.stream":{source:"iana"},"application/vnd.apache.parquet":{source:"iana"},"application/vnd.apache.thrift.binary":{source:"iana"},"application/vnd.apache.thrift.compact":{source:"iana"},"application/vnd.apache.thrift.json":{source:"iana"},"application/vnd.apexlang":{source:"iana"},"application/vnd.api+json":{source:"iana",compressible:!0},"application/vnd.aplextor.warrp+json":{source:"iana",compressible:!0},"application/vnd.apothekende.reservation+json":{source:"iana",compressible:!0},"application/vnd.apple.installer+xml":{source:"iana",compressible:!0,extensions:["mpkg"]},"application/vnd.apple.keynote":{source:"iana",extensions:["key"]},"application/vnd.apple.mpegurl":{source:"iana",extensions:["m3u8"]},"application/vnd.apple.numbers":{source:"iana",extensions:["numbers"]},"application/vnd.apple.pages":{source:"iana",extensions:["pages"]},"application/vnd.apple.pkpass":{compressible:!1,extensions:["pkpass"]},"application/vnd.arastra.swi":{source:"apache"},"application/vnd.aristanetworks.swi":{source:"iana",extensions:["swi"]},"application/vnd.artisan+json":{source:"iana",compressible:!0},"application/vnd.artsquare":{source:"iana"},"application/vnd.astraea-software.iota":{source:"iana",extensions:["iota"]},"application/vnd.audiograph":{source:"iana",extensions:["aep"]},"application/vnd.autodesk.fbx":{extensions:["fbx"]},"application/vnd.autopackage":{source:"iana"},"application/vnd.avalon+json":{source:"iana",compressible:!0},"application/vnd.avistar+xml":{source:"iana",compressible:!0},"application/vnd.balsamiq.bmml+xml":{source:"iana",compressible:!0,extensions:["bmml"]},"application/vnd.balsamiq.bmpr":{source:"iana"},"application/vnd.banana-accounting":{source:"iana"},"application/vnd.bbf.usp.error":{source:"iana"},"application/vnd.bbf.usp.msg":{source:"iana"},"application/vnd.bbf.usp.msg+json":{source:"iana",compressible:!0},"application/vnd.bekitzur-stech+json":{source:"iana",compressible:!0},"application/vnd.belightsoft.lhzd+zip":{source:"iana",compressible:!1},"application/vnd.belightsoft.lhzl+zip":{source:"iana",compressible:!1},"application/vnd.bint.med-content":{source:"iana"},"application/vnd.biopax.rdf+xml":{source:"iana",compressible:!0},"application/vnd.blink-idb-value-wrapper":{source:"iana"},"application/vnd.blueice.multipass":{source:"iana",extensions:["mpm"]},"application/vnd.bluetooth.ep.oob":{source:"iana"},"application/vnd.bluetooth.le.oob":{source:"iana"},"application/vnd.bmi":{source:"iana",extensions:["bmi"]},"application/vnd.bpf":{source:"iana"},"application/vnd.bpf3":{source:"iana"},"application/vnd.businessobjects":{source:"iana",extensions:["rep"]},"application/vnd.byu.uapi+json":{source:"iana",compressible:!0},"application/vnd.bzip3":{source:"iana"},"application/vnd.c3voc.schedule+xml":{source:"iana",compressible:!0},"application/vnd.cab-jscript":{source:"iana"},"application/vnd.canon-cpdl":{source:"iana"},"application/vnd.canon-lips":{source:"iana"},"application/vnd.capasystems-pg+json":{source:"iana",compressible:!0},"application/vnd.cendio.thinlinc.clientconf":{source:"iana"},"application/vnd.century-systems.tcp_stream":{source:"iana"},"application/vnd.chemdraw+xml":{source:"iana",compressible:!0,extensions:["cdxml"]},"application/vnd.chess-pgn":{source:"iana"},"application/vnd.chipnuts.karaoke-mmd":{source:"iana",extensions:["mmd"]},"application/vnd.ciedi":{source:"iana"},"application/vnd.cinderella":{source:"iana",extensions:["cdy"]},"application/vnd.cirpack.isdn-ext":{source:"iana"},"application/vnd.citationstyles.style+xml":{source:"iana",compressible:!0,extensions:["csl"]},"application/vnd.claymore":{source:"iana",extensions:["cla"]},"application/vnd.cloanto.rp9":{source:"iana",extensions:["rp9"]},"application/vnd.clonk.c4group":{source:"iana",extensions:["c4g","c4d","c4f","c4p","c4u"]},"application/vnd.cluetrust.cartomobile-config":{source:"iana",extensions:["c11amc"]},"application/vnd.cluetrust.cartomobile-config-pkg":{source:"iana",extensions:["c11amz"]},"application/vnd.cncf.helm.chart.content.v1.tar+gzip":{source:"iana"},"application/vnd.cncf.helm.chart.provenance.v1.prov":{source:"iana"},"application/vnd.cncf.helm.config.v1+json":{source:"iana",compressible:!0},"application/vnd.coffeescript":{source:"iana"},"application/vnd.collabio.xodocuments.document":{source:"iana"},"application/vnd.collabio.xodocuments.document-template":{source:"iana"},"application/vnd.collabio.xodocuments.presentation":{source:"iana"},"application/vnd.collabio.xodocuments.presentation-template":{source:"iana"},"application/vnd.collabio.xodocuments.spreadsheet":{source:"iana"},"application/vnd.collabio.xodocuments.spreadsheet-template":{source:"iana"},"application/vnd.collection+json":{source:"iana",compressible:!0},"application/vnd.collection.doc+json":{source:"iana",compressible:!0},"application/vnd.collection.next+json":{source:"iana",compressible:!0},"application/vnd.comicbook+zip":{source:"iana",compressible:!1},"application/vnd.comicbook-rar":{source:"iana"},"application/vnd.commerce-battelle":{source:"iana"},"application/vnd.commonspace":{source:"iana",extensions:["csp"]},"application/vnd.contact.cmsg":{source:"iana",extensions:["cdbcmsg"]},"application/vnd.coreos.ignition+json":{source:"iana",compressible:!0},"application/vnd.cosmocaller":{source:"iana",extensions:["cmc"]},"application/vnd.crick.clicker":{source:"iana",extensions:["clkx"]},"application/vnd.crick.clicker.keyboard":{source:"iana",extensions:["clkk"]},"application/vnd.crick.clicker.palette":{source:"iana",extensions:["clkp"]},"application/vnd.crick.clicker.template":{source:"iana",extensions:["clkt"]},"application/vnd.crick.clicker.wordbank":{source:"iana",extensions:["clkw"]},"application/vnd.criticaltools.wbs+xml":{source:"iana",compressible:!0,extensions:["wbs"]},"application/vnd.cryptii.pipe+json":{source:"iana",compressible:!0},"application/vnd.crypto-shade-file":{source:"iana"},"application/vnd.cryptomator.encrypted":{source:"iana"},"application/vnd.cryptomator.vault":{source:"iana"},"application/vnd.ctc-posml":{source:"iana",extensions:["pml"]},"application/vnd.ctct.ws+xml":{source:"iana",compressible:!0},"application/vnd.cups-pdf":{source:"iana"},"application/vnd.cups-postscript":{source:"iana"},"application/vnd.cups-ppd":{source:"iana",extensions:["ppd"]},"application/vnd.cups-raster":{source:"iana"},"application/vnd.cups-raw":{source:"iana"},"application/vnd.curl":{source:"iana"},"application/vnd.curl.car":{source:"apache",extensions:["car"]},"application/vnd.curl.pcurl":{source:"apache",extensions:["pcurl"]},"application/vnd.cyan.dean.root+xml":{source:"iana",compressible:!0},"application/vnd.cybank":{source:"iana"},"application/vnd.cyclonedx+json":{source:"iana",compressible:!0},"application/vnd.cyclonedx+xml":{source:"iana",compressible:!0},"application/vnd.d2l.coursepackage1p0+zip":{source:"iana",compressible:!1},"application/vnd.d3m-dataset":{source:"iana"},"application/vnd.d3m-problem":{source:"iana"},"application/vnd.dart":{source:"iana",compressible:!0,extensions:["dart"]},"application/vnd.data-vision.rdz":{source:"iana",extensions:["rdz"]},"application/vnd.datalog":{source:"iana"},"application/vnd.datapackage+json":{source:"iana",compressible:!0},"application/vnd.dataresource+json":{source:"iana",compressible:!0},"application/vnd.dbf":{source:"iana",extensions:["dbf"]},"application/vnd.dcmp+xml":{source:"iana",compressible:!0,extensions:["dcmp"]},"application/vnd.debian.binary-package":{source:"iana"},"application/vnd.dece.data":{source:"iana",extensions:["uvf","uvvf","uvd","uvvd"]},"application/vnd.dece.ttml+xml":{source:"iana",compressible:!0,extensions:["uvt","uvvt"]},"application/vnd.dece.unspecified":{source:"iana",extensions:["uvx","uvvx"]},"application/vnd.dece.zip":{source:"iana",extensions:["uvz","uvvz"]},"application/vnd.denovo.fcselayout-link":{source:"iana",extensions:["fe_launch"]},"application/vnd.desmume.movie":{source:"iana"},"application/vnd.dir-bi.plate-dl-nosuffix":{source:"iana"},"application/vnd.dm.delegation+xml":{source:"iana",compressible:!0},"application/vnd.dna":{source:"iana",extensions:["dna"]},"application/vnd.document+json":{source:"iana",compressible:!0},"application/vnd.dolby.mlp":{source:"apache",extensions:["mlp"]},"application/vnd.dolby.mobile.1":{source:"iana"},"application/vnd.dolby.mobile.2":{source:"iana"},"application/vnd.doremir.scorecloud-binary-document":{source:"iana"},"application/vnd.dpgraph":{source:"iana",extensions:["dpg"]},"application/vnd.dreamfactory":{source:"iana",extensions:["dfac"]},"application/vnd.drive+json":{source:"iana",compressible:!0},"application/vnd.ds-keypoint":{source:"apache",extensions:["kpxx"]},"application/vnd.dtg.local":{source:"iana"},"application/vnd.dtg.local.flash":{source:"iana"},"application/vnd.dtg.local.html":{source:"iana"},"application/vnd.dvb.ait":{source:"iana",extensions:["ait"]},"application/vnd.dvb.dvbisl+xml":{source:"iana",compressible:!0},"application/vnd.dvb.dvbj":{source:"iana"},"application/vnd.dvb.esgcontainer":{source:"iana"},"application/vnd.dvb.ipdcdftnotifaccess":{source:"iana"},"application/vnd.dvb.ipdcesgaccess":{source:"iana"},"application/vnd.dvb.ipdcesgaccess2":{source:"iana"},"application/vnd.dvb.ipdcesgpdd":{source:"iana"},"application/vnd.dvb.ipdcroaming":{source:"iana"},"application/vnd.dvb.iptv.alfec-base":{source:"iana"},"application/vnd.dvb.iptv.alfec-enhancement":{source:"iana"},"application/vnd.dvb.notif-aggregate-root+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-container+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-generic+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-ia-msglist+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-ia-registration-request+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-ia-registration-response+xml":{source:"iana",compressible:!0},"application/vnd.dvb.notif-init+xml":{source:"iana",compressible:!0},"application/vnd.dvb.pfr":{source:"iana"},"application/vnd.dvb.service":{source:"iana",extensions:["svc"]},"application/vnd.dxr":{source:"iana"},"application/vnd.dynageo":{source:"iana",extensions:["geo"]},"application/vnd.dzr":{source:"iana"},"application/vnd.easykaraoke.cdgdownload":{source:"iana"},"application/vnd.ecdis-update":{source:"iana"},"application/vnd.ecip.rlp":{source:"iana"},"application/vnd.eclipse.ditto+json":{source:"iana",compressible:!0},"application/vnd.ecowin.chart":{source:"iana",extensions:["mag"]},"application/vnd.ecowin.filerequest":{source:"iana"},"application/vnd.ecowin.fileupdate":{source:"iana"},"application/vnd.ecowin.series":{source:"iana"},"application/vnd.ecowin.seriesrequest":{source:"iana"},"application/vnd.ecowin.seriesupdate":{source:"iana"},"application/vnd.efi.img":{source:"iana"},"application/vnd.efi.iso":{source:"iana"},"application/vnd.eln+zip":{source:"iana",compressible:!1},"application/vnd.emclient.accessrequest+xml":{source:"iana",compressible:!0},"application/vnd.enliven":{source:"iana",extensions:["nml"]},"application/vnd.enphase.envoy":{source:"iana"},"application/vnd.eprints.data+xml":{source:"iana",compressible:!0},"application/vnd.epson.esf":{source:"iana",extensions:["esf"]},"application/vnd.epson.msf":{source:"iana",extensions:["msf"]},"application/vnd.epson.quickanime":{source:"iana",extensions:["qam"]},"application/vnd.epson.salt":{source:"iana",extensions:["slt"]},"application/vnd.epson.ssf":{source:"iana",extensions:["ssf"]},"application/vnd.ericsson.quickcall":{source:"iana"},"application/vnd.erofs":{source:"iana"},"application/vnd.espass-espass+zip":{source:"iana",compressible:!1},"application/vnd.eszigno3+xml":{source:"iana",compressible:!0,extensions:["es3","et3"]},"application/vnd.etsi.aoc+xml":{source:"iana",compressible:!0},"application/vnd.etsi.asic-e+zip":{source:"iana",compressible:!1},"application/vnd.etsi.asic-s+zip":{source:"iana",compressible:!1},"application/vnd.etsi.cug+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvcommand+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvdiscovery+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvprofile+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvsad-bc+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvsad-cod+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvsad-npvr+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvservice+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvsync+xml":{source:"iana",compressible:!0},"application/vnd.etsi.iptvueprofile+xml":{source:"iana",compressible:!0},"application/vnd.etsi.mcid+xml":{source:"iana",compressible:!0},"application/vnd.etsi.mheg5":{source:"iana"},"application/vnd.etsi.overload-control-policy-dataset+xml":{source:"iana",compressible:!0},"application/vnd.etsi.pstn+xml":{source:"iana",compressible:!0},"application/vnd.etsi.sci+xml":{source:"iana",compressible:!0},"application/vnd.etsi.simservs+xml":{source:"iana",compressible:!0},"application/vnd.etsi.timestamp-token":{source:"iana"},"application/vnd.etsi.tsl+xml":{source:"iana",compressible:!0},"application/vnd.etsi.tsl.der":{source:"iana"},"application/vnd.eu.kasparian.car+json":{source:"iana",compressible:!0},"application/vnd.eudora.data":{source:"iana"},"application/vnd.evolv.ecig.profile":{source:"iana"},"application/vnd.evolv.ecig.settings":{source:"iana"},"application/vnd.evolv.ecig.theme":{source:"iana"},"application/vnd.exstream-empower+zip":{source:"iana",compressible:!1},"application/vnd.exstream-package":{source:"iana"},"application/vnd.ezpix-album":{source:"iana",extensions:["ez2"]},"application/vnd.ezpix-package":{source:"iana",extensions:["ez3"]},"application/vnd.f-secure.mobile":{source:"iana"},"application/vnd.familysearch.gedcom+zip":{source:"iana",compressible:!1},"application/vnd.fastcopy-disk-image":{source:"iana"},"application/vnd.fdf":{source:"apache",extensions:["fdf"]},"application/vnd.fdsn.mseed":{source:"iana",extensions:["mseed"]},"application/vnd.fdsn.seed":{source:"iana",extensions:["seed","dataless"]},"application/vnd.fdsn.stationxml+xml":{source:"iana",charset:"XML-BASED",compressible:!0},"application/vnd.ffsns":{source:"iana"},"application/vnd.ficlab.flb+zip":{source:"iana",compressible:!1},"application/vnd.filmit.zfc":{source:"iana"},"application/vnd.fints":{source:"iana"},"application/vnd.firemonkeys.cloudcell":{source:"iana"},"application/vnd.flographit":{source:"iana",extensions:["gph"]},"application/vnd.fluxtime.clip":{source:"iana",extensions:["ftc"]},"application/vnd.font-fontforge-sfd":{source:"iana"},"application/vnd.framemaker":{source:"iana",extensions:["fm","frame","maker","book"]},"application/vnd.freelog.comic":{source:"iana"},"application/vnd.frogans.fnc":{source:"apache",extensions:["fnc"]},"application/vnd.frogans.ltf":{source:"apache",extensions:["ltf"]},"application/vnd.fsc.weblaunch":{source:"iana",extensions:["fsc"]},"application/vnd.fujifilm.fb.docuworks":{source:"iana"},"application/vnd.fujifilm.fb.docuworks.binder":{source:"iana"},"application/vnd.fujifilm.fb.docuworks.container":{source:"iana"},"application/vnd.fujifilm.fb.jfi+xml":{source:"iana",compressible:!0},"application/vnd.fujitsu.oasys":{source:"iana",extensions:["oas"]},"application/vnd.fujitsu.oasys2":{source:"iana",extensions:["oa2"]},"application/vnd.fujitsu.oasys3":{source:"iana",extensions:["oa3"]},"application/vnd.fujitsu.oasysgp":{source:"iana",extensions:["fg5"]},"application/vnd.fujitsu.oasysprs":{source:"iana",extensions:["bh2"]},"application/vnd.fujixerox.art-ex":{source:"iana"},"application/vnd.fujixerox.art4":{source:"iana"},"application/vnd.fujixerox.ddd":{source:"iana",extensions:["ddd"]},"application/vnd.fujixerox.docuworks":{source:"iana",extensions:["xdw"]},"application/vnd.fujixerox.docuworks.binder":{source:"iana",extensions:["xbd"]},"application/vnd.fujixerox.docuworks.container":{source:"iana"},"application/vnd.fujixerox.hbpl":{source:"iana"},"application/vnd.fut-misnet":{source:"iana"},"application/vnd.futoin+cbor":{source:"iana"},"application/vnd.futoin+json":{source:"iana",compressible:!0},"application/vnd.fuzzysheet":{source:"iana",extensions:["fzs"]},"application/vnd.ga4gh.passport+jwt":{source:"iana"},"application/vnd.genomatix.tuxedo":{source:"iana",extensions:["txd"]},"application/vnd.genozip":{source:"iana"},"application/vnd.gentics.grd+json":{source:"iana",compressible:!0},"application/vnd.gentoo.catmetadata+xml":{source:"iana",compressible:!0},"application/vnd.gentoo.ebuild":{source:"iana"},"application/vnd.gentoo.eclass":{source:"iana"},"application/vnd.gentoo.gpkg":{source:"iana"},"application/vnd.gentoo.manifest":{source:"iana"},"application/vnd.gentoo.pkgmetadata+xml":{source:"iana",compressible:!0},"application/vnd.gentoo.xpak":{source:"iana"},"application/vnd.geo+json":{source:"apache",compressible:!0},"application/vnd.geocube+xml":{source:"apache",compressible:!0},"application/vnd.geogebra.file":{source:"iana",extensions:["ggb"]},"application/vnd.geogebra.pinboard":{source:"iana"},"application/vnd.geogebra.slides":{source:"iana",extensions:["ggs"]},"application/vnd.geogebra.tool":{source:"iana",extensions:["ggt"]},"application/vnd.geometry-explorer":{source:"iana",extensions:["gex","gre"]},"application/vnd.geonext":{source:"iana",extensions:["gxt"]},"application/vnd.geoplan":{source:"iana",extensions:["g2w"]},"application/vnd.geospace":{source:"iana",extensions:["g3w"]},"application/vnd.gerber":{source:"iana"},"application/vnd.globalplatform.card-content-mgt":{source:"iana"},"application/vnd.globalplatform.card-content-mgt-response":{source:"iana"},"application/vnd.gmx":{source:"iana",extensions:["gmx"]},"application/vnd.gnu.taler.exchange+json":{source:"iana",compressible:!0},"application/vnd.gnu.taler.merchant+json":{source:"iana",compressible:!0},"application/vnd.google-apps.audio":{},"application/vnd.google-apps.document":{compressible:!1,extensions:["gdoc"]},"application/vnd.google-apps.drawing":{compressible:!1,extensions:["gdraw"]},"application/vnd.google-apps.drive-sdk":{compressible:!1},"application/vnd.google-apps.file":{},"application/vnd.google-apps.folder":{compressible:!1},"application/vnd.google-apps.form":{compressible:!1,extensions:["gform"]},"application/vnd.google-apps.fusiontable":{},"application/vnd.google-apps.jam":{compressible:!1,extensions:["gjam"]},"application/vnd.google-apps.mail-layout":{},"application/vnd.google-apps.map":{compressible:!1,extensions:["gmap"]},"application/vnd.google-apps.photo":{},"application/vnd.google-apps.presentation":{compressible:!1,extensions:["gslides"]},"application/vnd.google-apps.script":{compressible:!1,extensions:["gscript"]},"application/vnd.google-apps.shortcut":{},"application/vnd.google-apps.site":{compressible:!1,extensions:["gsite"]},"application/vnd.google-apps.spreadsheet":{compressible:!1,extensions:["gsheet"]},"application/vnd.google-apps.unknown":{},"application/vnd.google-apps.video":{},"application/vnd.google-earth.kml+xml":{source:"iana",compressible:!0,extensions:["kml"]},"application/vnd.google-earth.kmz":{source:"iana",compressible:!1,extensions:["kmz"]},"application/vnd.gov.sk.e-form+xml":{source:"apache",compressible:!0},"application/vnd.gov.sk.e-form+zip":{source:"iana",compressible:!1},"application/vnd.gov.sk.xmldatacontainer+xml":{source:"iana",compressible:!0,extensions:["xdcf"]},"application/vnd.gpxsee.map+xml":{source:"iana",compressible:!0},"application/vnd.grafeq":{source:"iana",extensions:["gqf","gqs"]},"application/vnd.gridmp":{source:"iana"},"application/vnd.groove-account":{source:"iana",extensions:["gac"]},"application/vnd.groove-help":{source:"iana",extensions:["ghf"]},"application/vnd.groove-identity-message":{source:"iana",extensions:["gim"]},"application/vnd.groove-injector":{source:"iana",extensions:["grv"]},"application/vnd.groove-tool-message":{source:"iana",extensions:["gtm"]},"application/vnd.groove-tool-template":{source:"iana",extensions:["tpl"]},"application/vnd.groove-vcard":{source:"iana",extensions:["vcg"]},"application/vnd.hal+json":{source:"iana",compressible:!0},"application/vnd.hal+xml":{source:"iana",compressible:!0,extensions:["hal"]},"application/vnd.handheld-entertainment+xml":{source:"iana",compressible:!0,extensions:["zmm"]},"application/vnd.hbci":{source:"iana",extensions:["hbci"]},"application/vnd.hc+json":{source:"iana",compressible:!0},"application/vnd.hcl-bireports":{source:"iana"},"application/vnd.hdt":{source:"iana"},"application/vnd.heroku+json":{source:"iana",compressible:!0},"application/vnd.hhe.lesson-player":{source:"iana",extensions:["les"]},"application/vnd.hp-hpgl":{source:"iana",extensions:["hpgl"]},"application/vnd.hp-hpid":{source:"iana",extensions:["hpid"]},"application/vnd.hp-hps":{source:"iana",extensions:["hps"]},"application/vnd.hp-jlyt":{source:"iana",extensions:["jlt"]},"application/vnd.hp-pcl":{source:"iana",extensions:["pcl"]},"application/vnd.hp-pclxl":{source:"iana",extensions:["pclxl"]},"application/vnd.hsl":{source:"iana"},"application/vnd.httphone":{source:"iana"},"application/vnd.hydrostatix.sof-data":{source:"iana",extensions:["sfd-hdstx"]},"application/vnd.hyper+json":{source:"iana",compressible:!0},"application/vnd.hyper-item+json":{source:"iana",compressible:!0},"application/vnd.hyperdrive+json":{source:"iana",compressible:!0},"application/vnd.hzn-3d-crossword":{source:"iana"},"application/vnd.ibm.afplinedata":{source:"apache"},"application/vnd.ibm.electronic-media":{source:"iana"},"application/vnd.ibm.minipay":{source:"iana",extensions:["mpy"]},"application/vnd.ibm.modcap":{source:"apache",extensions:["afp","listafp","list3820"]},"application/vnd.ibm.rights-management":{source:"iana",extensions:["irm"]},"application/vnd.ibm.secure-container":{source:"iana",extensions:["sc"]},"application/vnd.iccprofile":{source:"iana",extensions:["icc","icm"]},"application/vnd.ieee.1905":{source:"iana"},"application/vnd.igloader":{source:"iana",extensions:["igl"]},"application/vnd.imagemeter.folder+zip":{source:"iana",compressible:!1},"application/vnd.imagemeter.image+zip":{source:"iana",compressible:!1},"application/vnd.immervision-ivp":{source:"iana",extensions:["ivp"]},"application/vnd.immervision-ivu":{source:"iana",extensions:["ivu"]},"application/vnd.ims.imsccv1p1":{source:"iana"},"application/vnd.ims.imsccv1p2":{source:"iana"},"application/vnd.ims.imsccv1p3":{source:"iana"},"application/vnd.ims.lis.v2.result+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolconsumerprofile+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolproxy+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolproxy.id+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolsettings+json":{source:"iana",compressible:!0},"application/vnd.ims.lti.v2.toolsettings.simple+json":{source:"iana",compressible:!0},"application/vnd.informedcontrol.rms+xml":{source:"iana",compressible:!0},"application/vnd.informix-visionary":{source:"apache"},"application/vnd.infotech.project":{source:"iana"},"application/vnd.infotech.project+xml":{source:"iana",compressible:!0},"application/vnd.innopath.wamp.notification":{source:"iana"},"application/vnd.insors.igm":{source:"iana",extensions:["igm"]},"application/vnd.intercon.formnet":{source:"iana",extensions:["xpw","xpx"]},"application/vnd.intergeo":{source:"iana",extensions:["i2g"]},"application/vnd.intertrust.digibox":{source:"iana"},"application/vnd.intertrust.nncp":{source:"iana"},"application/vnd.intu.qbo":{source:"iana",extensions:["qbo"]},"application/vnd.intu.qfx":{source:"iana",extensions:["qfx"]},"application/vnd.ipfs.ipns-record":{source:"iana"},"application/vnd.ipld.car":{source:"iana"},"application/vnd.ipld.dag-cbor":{source:"iana"},"application/vnd.ipld.dag-json":{source:"iana"},"application/vnd.ipld.raw":{source:"iana"},"application/vnd.iptc.g2.catalogitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.conceptitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.knowledgeitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.newsitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.newsmessage+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.packageitem+xml":{source:"iana",compressible:!0},"application/vnd.iptc.g2.planningitem+xml":{source:"iana",compressible:!0},"application/vnd.ipunplugged.rcprofile":{source:"iana",extensions:["rcprofile"]},"application/vnd.irepository.package+xml":{source:"iana",compressible:!0,extensions:["irp"]},"application/vnd.is-xpr":{source:"iana",extensions:["xpr"]},"application/vnd.isac.fcs":{source:"iana",extensions:["fcs"]},"application/vnd.iso11783-10+zip":{source:"iana",compressible:!1},"application/vnd.jam":{source:"iana",extensions:["jam"]},"application/vnd.japannet-directory-service":{source:"iana"},"application/vnd.japannet-jpnstore-wakeup":{source:"iana"},"application/vnd.japannet-payment-wakeup":{source:"iana"},"application/vnd.japannet-registration":{source:"iana"},"application/vnd.japannet-registration-wakeup":{source:"iana"},"application/vnd.japannet-setstore-wakeup":{source:"iana"},"application/vnd.japannet-verification":{source:"iana"},"application/vnd.japannet-verification-wakeup":{source:"iana"},"application/vnd.jcp.javame.midlet-rms":{source:"iana",extensions:["rms"]},"application/vnd.jisp":{source:"iana",extensions:["jisp"]},"application/vnd.joost.joda-archive":{source:"iana",extensions:["joda"]},"application/vnd.jsk.isdn-ngn":{source:"iana"},"application/vnd.kahootz":{source:"iana",extensions:["ktz","ktr"]},"application/vnd.kde.karbon":{source:"iana",extensions:["karbon"]},"application/vnd.kde.kchart":{source:"iana",extensions:["chrt"]},"application/vnd.kde.kformula":{source:"iana",extensions:["kfo"]},"application/vnd.kde.kivio":{source:"iana",extensions:["flw"]},"application/vnd.kde.kontour":{source:"iana",extensions:["kon"]},"application/vnd.kde.kpresenter":{source:"iana",extensions:["kpr","kpt"]},"application/vnd.kde.kspread":{source:"iana",extensions:["ksp"]},"application/vnd.kde.kword":{source:"iana",extensions:["kwd","kwt"]},"application/vnd.kdl":{source:"iana"},"application/vnd.kenameaapp":{source:"iana",extensions:["htke"]},"application/vnd.keyman.kmp+zip":{source:"iana",compressible:!1},"application/vnd.keyman.kmx":{source:"iana"},"application/vnd.kidspiration":{source:"iana",extensions:["kia"]},"application/vnd.kinar":{source:"iana",extensions:["kne","knp"]},"application/vnd.koan":{source:"iana",extensions:["skp","skd","skt","skm"]},"application/vnd.kodak-descriptor":{source:"iana",extensions:["sse"]},"application/vnd.las":{source:"iana"},"application/vnd.las.las+json":{source:"iana",compressible:!0},"application/vnd.las.las+xml":{source:"iana",compressible:!0,extensions:["lasxml"]},"application/vnd.laszip":{source:"iana"},"application/vnd.ldev.productlicensing":{source:"iana"},"application/vnd.leap+json":{source:"iana",compressible:!0},"application/vnd.liberty-request+xml":{source:"iana",compressible:!0},"application/vnd.llamagraphics.life-balance.desktop":{source:"iana",extensions:["lbd"]},"application/vnd.llamagraphics.life-balance.exchange+xml":{source:"iana",compressible:!0,extensions:["lbe"]},"application/vnd.logipipe.circuit+zip":{source:"iana",compressible:!1},"application/vnd.loom":{source:"iana"},"application/vnd.lotus-1-2-3":{source:"iana",extensions:["123"]},"application/vnd.lotus-approach":{source:"iana",extensions:["apr"]},"application/vnd.lotus-freelance":{source:"iana",extensions:["pre"]},"application/vnd.lotus-notes":{source:"iana",extensions:["nsf"]},"application/vnd.lotus-organizer":{source:"iana",extensions:["org"]},"application/vnd.lotus-screencam":{source:"iana",extensions:["scm"]},"application/vnd.lotus-wordpro":{source:"iana",extensions:["lwp"]},"application/vnd.macports.portpkg":{source:"iana",extensions:["portpkg"]},"application/vnd.mapbox-vector-tile":{source:"iana",extensions:["mvt"]},"application/vnd.marlin.drm.actiontoken+xml":{source:"iana",compressible:!0},"application/vnd.marlin.drm.conftoken+xml":{source:"iana",compressible:!0},"application/vnd.marlin.drm.license+xml":{source:"iana",compressible:!0},"application/vnd.marlin.drm.mdcf":{source:"iana"},"application/vnd.mason+json":{source:"iana",compressible:!0},"application/vnd.maxar.archive.3tz+zip":{source:"iana",compressible:!1},"application/vnd.maxmind.maxmind-db":{source:"iana"},"application/vnd.mcd":{source:"iana",extensions:["mcd"]},"application/vnd.mdl":{source:"iana"},"application/vnd.mdl-mbsdf":{source:"iana"},"application/vnd.medcalcdata":{source:"iana",extensions:["mc1"]},"application/vnd.mediastation.cdkey":{source:"iana",extensions:["cdkey"]},"application/vnd.medicalholodeck.recordxr":{source:"iana"},"application/vnd.meridian-slingshot":{source:"iana"},"application/vnd.mermaid":{source:"iana"},"application/vnd.mfer":{source:"iana",extensions:["mwf"]},"application/vnd.mfmp":{source:"iana",extensions:["mfm"]},"application/vnd.micro+json":{source:"iana",compressible:!0},"application/vnd.micrografx.flo":{source:"iana",extensions:["flo"]},"application/vnd.micrografx.igx":{source:"iana",extensions:["igx"]},"application/vnd.microsoft.portable-executable":{source:"iana"},"application/vnd.microsoft.windows.thumbnail-cache":{source:"iana"},"application/vnd.miele+json":{source:"iana",compressible:!0},"application/vnd.mif":{source:"iana",extensions:["mif"]},"application/vnd.minisoft-hp3000-save":{source:"iana"},"application/vnd.mitsubishi.misty-guard.trustweb":{source:"iana"},"application/vnd.mobius.daf":{source:"iana",extensions:["daf"]},"application/vnd.mobius.dis":{source:"iana",extensions:["dis"]},"application/vnd.mobius.mbk":{source:"iana",extensions:["mbk"]},"application/vnd.mobius.mqy":{source:"iana",extensions:["mqy"]},"application/vnd.mobius.msl":{source:"iana",extensions:["msl"]},"application/vnd.mobius.plc":{source:"iana",extensions:["plc"]},"application/vnd.mobius.txf":{source:"iana",extensions:["txf"]},"application/vnd.modl":{source:"iana"},"application/vnd.mophun.application":{source:"iana",extensions:["mpn"]},"application/vnd.mophun.certificate":{source:"iana",extensions:["mpc"]},"application/vnd.motorola.flexsuite":{source:"iana"},"application/vnd.motorola.flexsuite.adsi":{source:"iana"},"application/vnd.motorola.flexsuite.fis":{source:"iana"},"application/vnd.motorola.flexsuite.gotap":{source:"iana"},"application/vnd.motorola.flexsuite.kmr":{source:"iana"},"application/vnd.motorola.flexsuite.ttc":{source:"iana"},"application/vnd.motorola.flexsuite.wem":{source:"iana"},"application/vnd.motorola.iprm":{source:"iana"},"application/vnd.mozilla.xul+xml":{source:"iana",compressible:!0,extensions:["xul"]},"application/vnd.ms-3mfdocument":{source:"iana"},"application/vnd.ms-artgalry":{source:"iana",extensions:["cil"]},"application/vnd.ms-asf":{source:"iana"},"application/vnd.ms-cab-compressed":{source:"iana",extensions:["cab"]},"application/vnd.ms-color.iccprofile":{source:"apache"},"application/vnd.ms-excel":{source:"iana",compressible:!1,extensions:["xls","xlm","xla","xlc","xlt","xlw"]},"application/vnd.ms-excel.addin.macroenabled.12":{source:"iana",extensions:["xlam"]},"application/vnd.ms-excel.sheet.binary.macroenabled.12":{source:"iana",extensions:["xlsb"]},"application/vnd.ms-excel.sheet.macroenabled.12":{source:"iana",extensions:["xlsm"]},"application/vnd.ms-excel.template.macroenabled.12":{source:"iana",extensions:["xltm"]},"application/vnd.ms-fontobject":{source:"iana",compressible:!0,extensions:["eot"]},"application/vnd.ms-htmlhelp":{source:"iana",extensions:["chm"]},"application/vnd.ms-ims":{source:"iana",extensions:["ims"]},"application/vnd.ms-lrm":{source:"iana",extensions:["lrm"]},"application/vnd.ms-office.activex+xml":{source:"iana",compressible:!0},"application/vnd.ms-officetheme":{source:"iana",extensions:["thmx"]},"application/vnd.ms-opentype":{source:"apache",compressible:!0},"application/vnd.ms-outlook":{compressible:!1,extensions:["msg"]},"application/vnd.ms-package.obfuscated-opentype":{source:"apache"},"application/vnd.ms-pki.seccat":{source:"apache",extensions:["cat"]},"application/vnd.ms-pki.stl":{source:"apache",extensions:["stl"]},"application/vnd.ms-playready.initiator+xml":{source:"iana",compressible:!0},"application/vnd.ms-powerpoint":{source:"iana",compressible:!1,extensions:["ppt","pps","pot"]},"application/vnd.ms-powerpoint.addin.macroenabled.12":{source:"iana",extensions:["ppam"]},"application/vnd.ms-powerpoint.presentation.macroenabled.12":{source:"iana",extensions:["pptm"]},"application/vnd.ms-powerpoint.slide.macroenabled.12":{source:"iana",extensions:["sldm"]},"application/vnd.ms-powerpoint.slideshow.macroenabled.12":{source:"iana",extensions:["ppsm"]},"application/vnd.ms-powerpoint.template.macroenabled.12":{source:"iana",extensions:["potm"]},"application/vnd.ms-printdevicecapabilities+xml":{source:"iana",compressible:!0},"application/vnd.ms-printing.printticket+xml":{source:"apache",compressible:!0},"application/vnd.ms-printschematicket+xml":{source:"iana",compressible:!0},"application/vnd.ms-project":{source:"iana",extensions:["mpp","mpt"]},"application/vnd.ms-tnef":{source:"iana"},"application/vnd.ms-visio.viewer":{extensions:["vdx"]},"application/vnd.ms-windows.devicepairing":{source:"iana"},"application/vnd.ms-windows.nwprinting.oob":{source:"iana"},"application/vnd.ms-windows.printerpairing":{source:"iana"},"application/vnd.ms-windows.wsd.oob":{source:"iana"},"application/vnd.ms-wmdrm.lic-chlg-req":{source:"iana"},"application/vnd.ms-wmdrm.lic-resp":{source:"iana"},"application/vnd.ms-wmdrm.meter-chlg-req":{source:"iana"},"application/vnd.ms-wmdrm.meter-resp":{source:"iana"},"application/vnd.ms-word.document.macroenabled.12":{source:"iana",extensions:["docm"]},"application/vnd.ms-word.template.macroenabled.12":{source:"iana",extensions:["dotm"]},"application/vnd.ms-works":{source:"iana",extensions:["wps","wks","wcm","wdb"]},"application/vnd.ms-wpl":{source:"iana",extensions:["wpl"]},"application/vnd.ms-xpsdocument":{source:"iana",compressible:!1,extensions:["xps"]},"application/vnd.msa-disk-image":{source:"iana"},"application/vnd.mseq":{source:"iana",extensions:["mseq"]},"application/vnd.msgpack":{source:"iana"},"application/vnd.msign":{source:"iana"},"application/vnd.multiad.creator":{source:"iana"},"application/vnd.multiad.creator.cif":{source:"iana"},"application/vnd.music-niff":{source:"iana"},"application/vnd.musician":{source:"iana",extensions:["mus"]},"application/vnd.muvee.style":{source:"iana",extensions:["msty"]},"application/vnd.mynfc":{source:"iana",extensions:["taglet"]},"application/vnd.nacamar.ybrid+json":{source:"iana",compressible:!0},"application/vnd.nato.bindingdataobject+cbor":{source:"iana"},"application/vnd.nato.bindingdataobject+json":{source:"iana",compressible:!0},"application/vnd.nato.bindingdataobject+xml":{source:"iana",compressible:!0,extensions:["bdo"]},"application/vnd.nato.openxmlformats-package.iepd+zip":{source:"iana",compressible:!1},"application/vnd.ncd.control":{source:"iana"},"application/vnd.ncd.reference":{source:"iana"},"application/vnd.nearst.inv+json":{source:"iana",compressible:!0},"application/vnd.nebumind.line":{source:"iana"},"application/vnd.nervana":{source:"iana"},"application/vnd.netfpx":{source:"iana"},"application/vnd.neurolanguage.nlu":{source:"iana",extensions:["nlu"]},"application/vnd.nimn":{source:"iana"},"application/vnd.nintendo.nitro.rom":{source:"iana"},"application/vnd.nintendo.snes.rom":{source:"iana"},"application/vnd.nitf":{source:"iana",extensions:["ntf","nitf"]},"application/vnd.noblenet-directory":{source:"iana",extensions:["nnd"]},"application/vnd.noblenet-sealer":{source:"iana",extensions:["nns"]},"application/vnd.noblenet-web":{source:"iana",extensions:["nnw"]},"application/vnd.nokia.catalogs":{source:"iana"},"application/vnd.nokia.conml+wbxml":{source:"iana"},"application/vnd.nokia.conml+xml":{source:"iana",compressible:!0},"application/vnd.nokia.iptv.config+xml":{source:"iana",compressible:!0},"application/vnd.nokia.isds-radio-presets":{source:"iana"},"application/vnd.nokia.landmark+wbxml":{source:"iana"},"application/vnd.nokia.landmark+xml":{source:"iana",compressible:!0},"application/vnd.nokia.landmarkcollection+xml":{source:"iana",compressible:!0},"application/vnd.nokia.n-gage.ac+xml":{source:"iana",compressible:!0,extensions:["ac"]},"application/vnd.nokia.n-gage.data":{source:"iana",extensions:["ngdat"]},"application/vnd.nokia.n-gage.symbian.install":{source:"apache",extensions:["n-gage"]},"application/vnd.nokia.ncd":{source:"iana"},"application/vnd.nokia.pcd+wbxml":{source:"iana"},"application/vnd.nokia.pcd+xml":{source:"iana",compressible:!0},"application/vnd.nokia.radio-preset":{source:"iana",extensions:["rpst"]},"application/vnd.nokia.radio-presets":{source:"iana",extensions:["rpss"]},"application/vnd.novadigm.edm":{source:"iana",extensions:["edm"]},"application/vnd.novadigm.edx":{source:"iana",extensions:["edx"]},"application/vnd.novadigm.ext":{source:"iana",extensions:["ext"]},"application/vnd.ntt-local.content-share":{source:"iana"},"application/vnd.ntt-local.file-transfer":{source:"iana"},"application/vnd.ntt-local.ogw_remote-access":{source:"iana"},"application/vnd.ntt-local.sip-ta_remote":{source:"iana"},"application/vnd.ntt-local.sip-ta_tcp_stream":{source:"iana"},"application/vnd.oai.workflows":{source:"iana"},"application/vnd.oai.workflows+json":{source:"iana",compressible:!0},"application/vnd.oai.workflows+yaml":{source:"iana"},"application/vnd.oasis.opendocument.base":{source:"iana"},"application/vnd.oasis.opendocument.chart":{source:"iana",extensions:["odc"]},"application/vnd.oasis.opendocument.chart-template":{source:"iana",extensions:["otc"]},"application/vnd.oasis.opendocument.database":{source:"apache",extensions:["odb"]},"application/vnd.oasis.opendocument.formula":{source:"iana",extensions:["odf"]},"application/vnd.oasis.opendocument.formula-template":{source:"iana",extensions:["odft"]},"application/vnd.oasis.opendocument.graphics":{source:"iana",compressible:!1,extensions:["odg"]},"application/vnd.oasis.opendocument.graphics-template":{source:"iana",extensions:["otg"]},"application/vnd.oasis.opendocument.image":{source:"iana",extensions:["odi"]},"application/vnd.oasis.opendocument.image-template":{source:"iana",extensions:["oti"]},"application/vnd.oasis.opendocument.presentation":{source:"iana",compressible:!1,extensions:["odp"]},"application/vnd.oasis.opendocument.presentation-template":{source:"iana",extensions:["otp"]},"application/vnd.oasis.opendocument.spreadsheet":{source:"iana",compressible:!1,extensions:["ods"]},"application/vnd.oasis.opendocument.spreadsheet-template":{source:"iana",extensions:["ots"]},"application/vnd.oasis.opendocument.text":{source:"iana",compressible:!1,extensions:["odt"]},"application/vnd.oasis.opendocument.text-master":{source:"iana",extensions:["odm"]},"application/vnd.oasis.opendocument.text-master-template":{source:"iana"},"application/vnd.oasis.opendocument.text-template":{source:"iana",extensions:["ott"]},"application/vnd.oasis.opendocument.text-web":{source:"iana",extensions:["oth"]},"application/vnd.obn":{source:"iana"},"application/vnd.ocf+cbor":{source:"iana"},"application/vnd.oci.image.manifest.v1+json":{source:"iana",compressible:!0},"application/vnd.oftn.l10n+json":{source:"iana",compressible:!0},"application/vnd.oipf.contentaccessdownload+xml":{source:"iana",compressible:!0},"application/vnd.oipf.contentaccessstreaming+xml":{source:"iana",compressible:!0},"application/vnd.oipf.cspg-hexbinary":{source:"iana"},"application/vnd.oipf.dae.svg+xml":{source:"iana",compressible:!0},"application/vnd.oipf.dae.xhtml+xml":{source:"iana",compressible:!0},"application/vnd.oipf.mippvcontrolmessage+xml":{source:"iana",compressible:!0},"application/vnd.oipf.pae.gem":{source:"iana"},"application/vnd.oipf.spdiscovery+xml":{source:"iana",compressible:!0},"application/vnd.oipf.spdlist+xml":{source:"iana",compressible:!0},"application/vnd.oipf.ueprofile+xml":{source:"iana",compressible:!0},"application/vnd.oipf.userprofile+xml":{source:"iana",compressible:!0},"application/vnd.olpc-sugar":{source:"iana",extensions:["xo"]},"application/vnd.oma-scws-config":{source:"iana"},"application/vnd.oma-scws-http-request":{source:"iana"},"application/vnd.oma-scws-http-response":{source:"iana"},"application/vnd.oma.bcast.associated-procedure-parameter+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.drm-trigger+xml":{source:"apache",compressible:!0},"application/vnd.oma.bcast.imd+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.ltkm":{source:"iana"},"application/vnd.oma.bcast.notification+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.provisioningtrigger":{source:"iana"},"application/vnd.oma.bcast.sgboot":{source:"iana"},"application/vnd.oma.bcast.sgdd+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.sgdu":{source:"iana"},"application/vnd.oma.bcast.simple-symbol-container":{source:"iana"},"application/vnd.oma.bcast.smartcard-trigger+xml":{source:"apache",compressible:!0},"application/vnd.oma.bcast.sprov+xml":{source:"iana",compressible:!0},"application/vnd.oma.bcast.stkm":{source:"iana"},"application/vnd.oma.cab-address-book+xml":{source:"iana",compressible:!0},"application/vnd.oma.cab-feature-handler+xml":{source:"iana",compressible:!0},"application/vnd.oma.cab-pcc+xml":{source:"iana",compressible:!0},"application/vnd.oma.cab-subs-invite+xml":{source:"iana",compressible:!0},"application/vnd.oma.cab-user-prefs+xml":{source:"iana",compressible:!0},"application/vnd.oma.dcd":{source:"iana"},"application/vnd.oma.dcdc":{source:"iana"},"application/vnd.oma.dd2+xml":{source:"iana",compressible:!0,extensions:["dd2"]},"application/vnd.oma.drm.risd+xml":{source:"iana",compressible:!0},"application/vnd.oma.group-usage-list+xml":{source:"iana",compressible:!0},"application/vnd.oma.lwm2m+cbor":{source:"iana"},"application/vnd.oma.lwm2m+json":{source:"iana",compressible:!0},"application/vnd.oma.lwm2m+tlv":{source:"iana"},"application/vnd.oma.pal+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.detailed-progress-report+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.final-report+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.groups+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.invocation-descriptor+xml":{source:"iana",compressible:!0},"application/vnd.oma.poc.optimized-progress-report+xml":{source:"iana",compressible:!0},"application/vnd.oma.push":{source:"iana"},"application/vnd.oma.scidm.messages+xml":{source:"iana",compressible:!0},"application/vnd.oma.xcap-directory+xml":{source:"iana",compressible:!0},"application/vnd.omads-email+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/vnd.omads-file+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/vnd.omads-folder+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/vnd.omaloc-supl-init":{source:"iana"},"application/vnd.onepager":{source:"iana"},"application/vnd.onepagertamp":{source:"iana"},"application/vnd.onepagertamx":{source:"iana"},"application/vnd.onepagertat":{source:"iana"},"application/vnd.onepagertatp":{source:"iana"},"application/vnd.onepagertatx":{source:"iana"},"application/vnd.onvif.metadata":{source:"iana"},"application/vnd.openblox.game+xml":{source:"iana",compressible:!0,extensions:["obgx"]},"application/vnd.openblox.game-binary":{source:"iana"},"application/vnd.openeye.oeb":{source:"iana"},"application/vnd.openofficeorg.extension":{source:"apache",extensions:["oxt"]},"application/vnd.openstreetmap.data+xml":{source:"iana",compressible:!0,extensions:["osm"]},"application/vnd.opentimestamps.ots":{source:"iana"},"application/vnd.openvpi.dspx+json":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.custom-properties+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.customxmlproperties+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawing+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.chart+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.diagramcolors+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.diagramdata+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.diagramlayout+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.drawingml.diagramstyle+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.extended-properties+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.commentauthors+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.comments+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.handoutmaster+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.notesmaster+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.notesslide+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.presentation":{source:"iana",compressible:!1,extensions:["pptx"]},"application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.presprops+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slide":{source:"iana",extensions:["sldx"]},"application/vnd.openxmlformats-officedocument.presentationml.slide+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slidelayout+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slidemaster+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slideshow":{source:"iana",extensions:["ppsx"]},"application/vnd.openxmlformats-officedocument.presentationml.slideshow.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.slideupdateinfo+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.tablestyles+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.tags+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.template":{source:"iana",extensions:["potx"]},"application/vnd.openxmlformats-officedocument.presentationml.template.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.presentationml.viewprops+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.calcchain+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.externallink+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcachedefinition+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotcacherecords+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.pivottable+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.querytable+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionheaders+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionlog+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedstrings+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":{source:"iana",compressible:!1,extensions:["xlsx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetmetadata+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.tablesinglecells+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.template":{source:"iana",extensions:["xltx"]},"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.usernames+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.volatiledependencies+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.theme+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.themeoverride+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.vmldrawing":{source:"iana"},"application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.document":{source:"iana",compressible:!1,extensions:["docx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.glossary+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.endnotes+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.fonttable+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.footer+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.footnotes+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.numbering+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.settings+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.template":{source:"iana",extensions:["dotx"]},"application/vnd.openxmlformats-officedocument.wordprocessingml.template.main+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-officedocument.wordprocessingml.websettings+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-package.core-properties+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-package.digital-signature-xmlsignature+xml":{source:"iana",compressible:!0},"application/vnd.openxmlformats-package.relationships+xml":{source:"iana",compressible:!0},"application/vnd.oracle.resource+json":{source:"iana",compressible:!0},"application/vnd.orange.indata":{source:"iana"},"application/vnd.osa.netdeploy":{source:"iana"},"application/vnd.osgeo.mapguide.package":{source:"iana",extensions:["mgp"]},"application/vnd.osgi.bundle":{source:"iana"},"application/vnd.osgi.dp":{source:"iana",extensions:["dp"]},"application/vnd.osgi.subsystem":{source:"iana",extensions:["esa"]},"application/vnd.otps.ct-kip+xml":{source:"iana",compressible:!0},"application/vnd.oxli.countgraph":{source:"iana"},"application/vnd.pagerduty+json":{source:"iana",compressible:!0},"application/vnd.palm":{source:"iana",extensions:["pdb","pqa","oprc"]},"application/vnd.panoply":{source:"iana"},"application/vnd.paos.xml":{source:"iana"},"application/vnd.patentdive":{source:"iana"},"application/vnd.patientecommsdoc":{source:"iana"},"application/vnd.pawaafile":{source:"iana",extensions:["paw"]},"application/vnd.pcos":{source:"iana"},"application/vnd.pg.format":{source:"iana",extensions:["str"]},"application/vnd.pg.osasli":{source:"iana",extensions:["ei6"]},"application/vnd.piaccess.application-licence":{source:"iana"},"application/vnd.picsel":{source:"iana",extensions:["efif"]},"application/vnd.pmi.widget":{source:"iana",extensions:["wg"]},"application/vnd.poc.group-advertisement+xml":{source:"iana",compressible:!0},"application/vnd.pocketlearn":{source:"iana",extensions:["plf"]},"application/vnd.powerbuilder6":{source:"iana",extensions:["pbd"]},"application/vnd.powerbuilder6-s":{source:"iana"},"application/vnd.powerbuilder7":{source:"iana"},"application/vnd.powerbuilder7-s":{source:"iana"},"application/vnd.powerbuilder75":{source:"iana"},"application/vnd.powerbuilder75-s":{source:"iana"},"application/vnd.preminet":{source:"iana"},"application/vnd.previewsystems.box":{source:"iana",extensions:["box"]},"application/vnd.procrate.brushset":{extensions:["brushset"]},"application/vnd.procreate.brush":{extensions:["brush"]},"application/vnd.procreate.dream":{extensions:["drm"]},"application/vnd.proteus.magazine":{source:"iana",extensions:["mgz"]},"application/vnd.psfs":{source:"iana"},"application/vnd.pt.mundusmundi":{source:"iana"},"application/vnd.publishare-delta-tree":{source:"iana",extensions:["qps"]},"application/vnd.pvi.ptid1":{source:"iana",extensions:["ptid"]},"application/vnd.pwg-multiplexed":{source:"iana"},"application/vnd.pwg-xhtml-print+xml":{source:"iana",compressible:!0,extensions:["xhtm"]},"application/vnd.qualcomm.brew-app-res":{source:"iana"},"application/vnd.quarantainenet":{source:"iana"},"application/vnd.quark.quarkxpress":{source:"iana",extensions:["qxd","qxt","qwd","qwt","qxl","qxb"]},"application/vnd.quobject-quoxdocument":{source:"iana"},"application/vnd.radisys.moml+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit-conf+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit-conn+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit-dialog+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-audit-stream+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-conf+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-base+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-fax-detect+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-fax-sendrecv+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-group+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-speech+xml":{source:"iana",compressible:!0},"application/vnd.radisys.msml-dialog-transform+xml":{source:"iana",compressible:!0},"application/vnd.rainstor.data":{source:"iana"},"application/vnd.rapid":{source:"iana"},"application/vnd.rar":{source:"iana",extensions:["rar"]},"application/vnd.realvnc.bed":{source:"iana",extensions:["bed"]},"application/vnd.recordare.musicxml":{source:"iana",extensions:["mxl"]},"application/vnd.recordare.musicxml+xml":{source:"iana",compressible:!0,extensions:["musicxml"]},"application/vnd.relpipe":{source:"iana"},"application/vnd.renlearn.rlprint":{source:"iana"},"application/vnd.resilient.logic":{source:"iana"},"application/vnd.restful+json":{source:"iana",compressible:!0},"application/vnd.rig.cryptonote":{source:"iana",extensions:["cryptonote"]},"application/vnd.rim.cod":{source:"apache",extensions:["cod"]},"application/vnd.rn-realmedia":{source:"apache",extensions:["rm"]},"application/vnd.rn-realmedia-vbr":{source:"apache",extensions:["rmvb"]},"application/vnd.route66.link66+xml":{source:"iana",compressible:!0,extensions:["link66"]},"application/vnd.rs-274x":{source:"iana"},"application/vnd.ruckus.download":{source:"iana"},"application/vnd.s3sms":{source:"iana"},"application/vnd.sailingtracker.track":{source:"iana",extensions:["st"]},"application/vnd.sar":{source:"iana"},"application/vnd.sbm.cid":{source:"iana"},"application/vnd.sbm.mid2":{source:"iana"},"application/vnd.scribus":{source:"iana"},"application/vnd.sealed.3df":{source:"iana"},"application/vnd.sealed.csf":{source:"iana"},"application/vnd.sealed.doc":{source:"iana"},"application/vnd.sealed.eml":{source:"iana"},"application/vnd.sealed.mht":{source:"iana"},"application/vnd.sealed.net":{source:"iana"},"application/vnd.sealed.ppt":{source:"iana"},"application/vnd.sealed.tiff":{source:"iana"},"application/vnd.sealed.xls":{source:"iana"},"application/vnd.sealedmedia.softseal.html":{source:"iana"},"application/vnd.sealedmedia.softseal.pdf":{source:"iana"},"application/vnd.seemail":{source:"iana",extensions:["see"]},"application/vnd.seis+json":{source:"iana",compressible:!0},"application/vnd.sema":{source:"iana",extensions:["sema"]},"application/vnd.semd":{source:"iana",extensions:["semd"]},"application/vnd.semf":{source:"iana",extensions:["semf"]},"application/vnd.shade-save-file":{source:"iana"},"application/vnd.shana.informed.formdata":{source:"iana",extensions:["ifm"]},"application/vnd.shana.informed.formtemplate":{source:"iana",extensions:["itp"]},"application/vnd.shana.informed.interchange":{source:"iana",extensions:["iif"]},"application/vnd.shana.informed.package":{source:"iana",extensions:["ipk"]},"application/vnd.shootproof+json":{source:"iana",compressible:!0},"application/vnd.shopkick+json":{source:"iana",compressible:!0},"application/vnd.shp":{source:"iana"},"application/vnd.shx":{source:"iana"},"application/vnd.sigrok.session":{source:"iana"},"application/vnd.simtech-mindmapper":{source:"iana",extensions:["twd","twds"]},"application/vnd.siren+json":{source:"iana",compressible:!0},"application/vnd.sketchometry":{source:"iana"},"application/vnd.smaf":{source:"iana",extensions:["mmf"]},"application/vnd.smart.notebook":{source:"iana"},"application/vnd.smart.teacher":{source:"iana",extensions:["teacher"]},"application/vnd.smintio.portals.archive":{source:"iana"},"application/vnd.snesdev-page-table":{source:"iana"},"application/vnd.software602.filler.form+xml":{source:"iana",compressible:!0,extensions:["fo"]},"application/vnd.software602.filler.form-xml-zip":{source:"iana"},"application/vnd.solent.sdkm+xml":{source:"iana",compressible:!0,extensions:["sdkm","sdkd"]},"application/vnd.spotfire.dxp":{source:"iana",extensions:["dxp"]},"application/vnd.spotfire.sfs":{source:"iana",extensions:["sfs"]},"application/vnd.sqlite3":{source:"iana"},"application/vnd.sss-cod":{source:"iana"},"application/vnd.sss-dtf":{source:"iana"},"application/vnd.sss-ntf":{source:"iana"},"application/vnd.stardivision.calc":{source:"apache",extensions:["sdc"]},"application/vnd.stardivision.draw":{source:"apache",extensions:["sda"]},"application/vnd.stardivision.impress":{source:"apache",extensions:["sdd"]},"application/vnd.stardivision.math":{source:"apache",extensions:["smf"]},"application/vnd.stardivision.writer":{source:"apache",extensions:["sdw","vor"]},"application/vnd.stardivision.writer-global":{source:"apache",extensions:["sgl"]},"application/vnd.stepmania.package":{source:"iana",extensions:["smzip"]},"application/vnd.stepmania.stepchart":{source:"iana",extensions:["sm"]},"application/vnd.street-stream":{source:"iana"},"application/vnd.sun.wadl+xml":{source:"iana",compressible:!0,extensions:["wadl"]},"application/vnd.sun.xml.calc":{source:"apache",extensions:["sxc"]},"application/vnd.sun.xml.calc.template":{source:"apache",extensions:["stc"]},"application/vnd.sun.xml.draw":{source:"apache",extensions:["sxd"]},"application/vnd.sun.xml.draw.template":{source:"apache",extensions:["std"]},"application/vnd.sun.xml.impress":{source:"apache",extensions:["sxi"]},"application/vnd.sun.xml.impress.template":{source:"apache",extensions:["sti"]},"application/vnd.sun.xml.math":{source:"apache",extensions:["sxm"]},"application/vnd.sun.xml.writer":{source:"apache",extensions:["sxw"]},"application/vnd.sun.xml.writer.global":{source:"apache",extensions:["sxg"]},"application/vnd.sun.xml.writer.template":{source:"apache",extensions:["stw"]},"application/vnd.sus-calendar":{source:"iana",extensions:["sus","susp"]},"application/vnd.svd":{source:"iana",extensions:["svd"]},"application/vnd.swiftview-ics":{source:"iana"},"application/vnd.sybyl.mol2":{source:"iana"},"application/vnd.sycle+xml":{source:"iana",compressible:!0},"application/vnd.syft+json":{source:"iana",compressible:!0},"application/vnd.symbian.install":{source:"apache",extensions:["sis","sisx"]},"application/vnd.syncml+xml":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["xsm"]},"application/vnd.syncml.dm+wbxml":{source:"iana",charset:"UTF-8",extensions:["bdm"]},"application/vnd.syncml.dm+xml":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["xdm"]},"application/vnd.syncml.dm.notification":{source:"iana"},"application/vnd.syncml.dmddf+wbxml":{source:"iana"},"application/vnd.syncml.dmddf+xml":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["ddf"]},"application/vnd.syncml.dmtnds+wbxml":{source:"iana"},"application/vnd.syncml.dmtnds+xml":{source:"iana",charset:"UTF-8",compressible:!0},"application/vnd.syncml.ds.notification":{source:"iana"},"application/vnd.tableschema+json":{source:"iana",compressible:!0},"application/vnd.tao.intent-module-archive":{source:"iana",extensions:["tao"]},"application/vnd.tcpdump.pcap":{source:"iana",extensions:["pcap","cap","dmp"]},"application/vnd.think-cell.ppttc+json":{source:"iana",compressible:!0},"application/vnd.tmd.mediaflex.api+xml":{source:"iana",compressible:!0},"application/vnd.tml":{source:"iana"},"application/vnd.tmobile-livetv":{source:"iana",extensions:["tmo"]},"application/vnd.tri.onesource":{source:"iana"},"application/vnd.trid.tpt":{source:"iana",extensions:["tpt"]},"application/vnd.triscape.mxs":{source:"iana",extensions:["mxs"]},"application/vnd.trueapp":{source:"iana",extensions:["tra"]},"application/vnd.truedoc":{source:"iana"},"application/vnd.ubisoft.webplayer":{source:"iana"},"application/vnd.ufdl":{source:"iana",extensions:["ufd","ufdl"]},"application/vnd.uic.osdm+json":{source:"iana",compressible:!0},"application/vnd.uiq.theme":{source:"iana",extensions:["utz"]},"application/vnd.umajin":{source:"iana",extensions:["umj"]},"application/vnd.unity":{source:"iana",extensions:["unityweb"]},"application/vnd.uoml+xml":{source:"iana",compressible:!0,extensions:["uoml","uo"]},"application/vnd.uplanet.alert":{source:"iana"},"application/vnd.uplanet.alert-wbxml":{source:"iana"},"application/vnd.uplanet.bearer-choice":{source:"iana"},"application/vnd.uplanet.bearer-choice-wbxml":{source:"iana"},"application/vnd.uplanet.cacheop":{source:"iana"},"application/vnd.uplanet.cacheop-wbxml":{source:"iana"},"application/vnd.uplanet.channel":{source:"iana"},"application/vnd.uplanet.channel-wbxml":{source:"iana"},"application/vnd.uplanet.list":{source:"iana"},"application/vnd.uplanet.list-wbxml":{source:"iana"},"application/vnd.uplanet.listcmd":{source:"iana"},"application/vnd.uplanet.listcmd-wbxml":{source:"iana"},"application/vnd.uplanet.signal":{source:"iana"},"application/vnd.uri-map":{source:"iana"},"application/vnd.valve.source.material":{source:"iana"},"application/vnd.vcx":{source:"iana",extensions:["vcx"]},"application/vnd.vd-study":{source:"iana"},"application/vnd.vectorworks":{source:"iana"},"application/vnd.vel+json":{source:"iana",compressible:!0},"application/vnd.veraison.tsm-report+cbor":{source:"iana"},"application/vnd.veraison.tsm-report+json":{source:"iana",compressible:!0},"application/vnd.verimatrix.vcas":{source:"iana"},"application/vnd.veritone.aion+json":{source:"iana",compressible:!0},"application/vnd.veryant.thin":{source:"iana"},"application/vnd.ves.encrypted":{source:"iana"},"application/vnd.vidsoft.vidconference":{source:"iana"},"application/vnd.visio":{source:"iana",extensions:["vsd","vst","vss","vsw","vsdx","vtx"]},"application/vnd.visionary":{source:"iana",extensions:["vis"]},"application/vnd.vividence.scriptfile":{source:"iana"},"application/vnd.vocalshaper.vsp4":{source:"iana"},"application/vnd.vsf":{source:"iana",extensions:["vsf"]},"application/vnd.wap.sic":{source:"iana"},"application/vnd.wap.slc":{source:"iana"},"application/vnd.wap.wbxml":{source:"iana",charset:"UTF-8",extensions:["wbxml"]},"application/vnd.wap.wmlc":{source:"iana",extensions:["wmlc"]},"application/vnd.wap.wmlscriptc":{source:"iana",extensions:["wmlsc"]},"application/vnd.wasmflow.wafl":{source:"iana"},"application/vnd.webturbo":{source:"iana",extensions:["wtb"]},"application/vnd.wfa.dpp":{source:"iana"},"application/vnd.wfa.p2p":{source:"iana"},"application/vnd.wfa.wsc":{source:"iana"},"application/vnd.windows.devicepairing":{source:"iana"},"application/vnd.wmc":{source:"iana"},"application/vnd.wmf.bootstrap":{source:"iana"},"application/vnd.wolfram.mathematica":{source:"iana"},"application/vnd.wolfram.mathematica.package":{source:"iana"},"application/vnd.wolfram.player":{source:"iana",extensions:["nbp"]},"application/vnd.wordlift":{source:"iana"},"application/vnd.wordperfect":{source:"iana",extensions:["wpd"]},"application/vnd.wqd":{source:"iana",extensions:["wqd"]},"application/vnd.wrq-hp3000-labelled":{source:"iana"},"application/vnd.wt.stf":{source:"iana",extensions:["stf"]},"application/vnd.wv.csp+wbxml":{source:"iana"},"application/vnd.wv.csp+xml":{source:"iana",compressible:!0},"application/vnd.wv.ssp+xml":{source:"iana",compressible:!0},"application/vnd.xacml+json":{source:"iana",compressible:!0},"application/vnd.xara":{source:"iana",extensions:["xar"]},"application/vnd.xarin.cpj":{source:"iana"},"application/vnd.xecrets-encrypted":{source:"iana"},"application/vnd.xfdl":{source:"iana",extensions:["xfdl"]},"application/vnd.xfdl.webform":{source:"iana"},"application/vnd.xmi+xml":{source:"iana",compressible:!0},"application/vnd.xmpie.cpkg":{source:"iana"},"application/vnd.xmpie.dpkg":{source:"iana"},"application/vnd.xmpie.plan":{source:"iana"},"application/vnd.xmpie.ppkg":{source:"iana"},"application/vnd.xmpie.xlim":{source:"iana"},"application/vnd.yamaha.hv-dic":{source:"iana",extensions:["hvd"]},"application/vnd.yamaha.hv-script":{source:"iana",extensions:["hvs"]},"application/vnd.yamaha.hv-voice":{source:"iana",extensions:["hvp"]},"application/vnd.yamaha.openscoreformat":{source:"iana",extensions:["osf"]},"application/vnd.yamaha.openscoreformat.osfpvg+xml":{source:"iana",compressible:!0,extensions:["osfpvg"]},"application/vnd.yamaha.remote-setup":{source:"iana"},"application/vnd.yamaha.smaf-audio":{source:"iana",extensions:["saf"]},"application/vnd.yamaha.smaf-phrase":{source:"iana",extensions:["spf"]},"application/vnd.yamaha.through-ngn":{source:"iana"},"application/vnd.yamaha.tunnel-udpencap":{source:"iana"},"application/vnd.yaoweme":{source:"iana"},"application/vnd.yellowriver-custom-menu":{source:"iana",extensions:["cmp"]},"application/vnd.zul":{source:"iana",extensions:["zir","zirz"]},"application/vnd.zzazz.deck+xml":{source:"iana",compressible:!0,extensions:["zaz"]},"application/voicexml+xml":{source:"iana",compressible:!0,extensions:["vxml"]},"application/voucher-cms+json":{source:"iana",compressible:!0},"application/voucher-jws+json":{source:"iana",compressible:!0},"application/vp":{source:"iana"},"application/vp+cose":{source:"iana"},"application/vp+jwt":{source:"iana"},"application/vq-rtcpxr":{source:"iana"},"application/wasm":{source:"iana",compressible:!0,extensions:["wasm"]},"application/watcherinfo+xml":{source:"iana",compressible:!0,extensions:["wif"]},"application/webpush-options+json":{source:"iana",compressible:!0},"application/whoispp-query":{source:"iana"},"application/whoispp-response":{source:"iana"},"application/widget":{source:"iana",extensions:["wgt"]},"application/winhlp":{source:"apache",extensions:["hlp"]},"application/wita":{source:"iana"},"application/wordperfect5.1":{source:"iana"},"application/wsdl+xml":{source:"iana",compressible:!0,extensions:["wsdl"]},"application/wspolicy+xml":{source:"iana",compressible:!0,extensions:["wspolicy"]},"application/x-7z-compressed":{source:"apache",compressible:!1,extensions:["7z"]},"application/x-abiword":{source:"apache",extensions:["abw"]},"application/x-ace-compressed":{source:"apache",extensions:["ace"]},"application/x-amf":{source:"apache"},"application/x-apple-diskimage":{source:"apache",extensions:["dmg"]},"application/x-arj":{compressible:!1,extensions:["arj"]},"application/x-authorware-bin":{source:"apache",extensions:["aab","x32","u32","vox"]},"application/x-authorware-map":{source:"apache",extensions:["aam"]},"application/x-authorware-seg":{source:"apache",extensions:["aas"]},"application/x-bcpio":{source:"apache",extensions:["bcpio"]},"application/x-bdoc":{compressible:!1,extensions:["bdoc"]},"application/x-bittorrent":{source:"apache",extensions:["torrent"]},"application/x-blender":{extensions:["blend"]},"application/x-blorb":{source:"apache",extensions:["blb","blorb"]},"application/x-bzip":{source:"apache",compressible:!1,extensions:["bz"]},"application/x-bzip2":{source:"apache",compressible:!1,extensions:["bz2","boz"]},"application/x-cbr":{source:"apache",extensions:["cbr","cba","cbt","cbz","cb7"]},"application/x-cdlink":{source:"apache",extensions:["vcd"]},"application/x-cfs-compressed":{source:"apache",extensions:["cfs"]},"application/x-chat":{source:"apache",extensions:["chat"]},"application/x-chess-pgn":{source:"apache",extensions:["pgn"]},"application/x-chrome-extension":{extensions:["crx"]},"application/x-cocoa":{source:"nginx",extensions:["cco"]},"application/x-compress":{source:"apache"},"application/x-compressed":{extensions:["rar"]},"application/x-conference":{source:"apache",extensions:["nsc"]},"application/x-cpio":{source:"apache",extensions:["cpio"]},"application/x-csh":{source:"apache",extensions:["csh"]},"application/x-deb":{compressible:!1},"application/x-debian-package":{source:"apache",extensions:["deb","udeb"]},"application/x-dgc-compressed":{source:"apache",extensions:["dgc"]},"application/x-director":{source:"apache",extensions:["dir","dcr","dxr","cst","cct","cxt","w3d","fgd","swa"]},"application/x-doom":{source:"apache",extensions:["wad"]},"application/x-dtbncx+xml":{source:"apache",compressible:!0,extensions:["ncx"]},"application/x-dtbook+xml":{source:"apache",compressible:!0,extensions:["dtb"]},"application/x-dtbresource+xml":{source:"apache",compressible:!0,extensions:["res"]},"application/x-dvi":{source:"apache",compressible:!1,extensions:["dvi"]},"application/x-envoy":{source:"apache",extensions:["evy"]},"application/x-eva":{source:"apache",extensions:["eva"]},"application/x-font-bdf":{source:"apache",extensions:["bdf"]},"application/x-font-dos":{source:"apache"},"application/x-font-framemaker":{source:"apache"},"application/x-font-ghostscript":{source:"apache",extensions:["gsf"]},"application/x-font-libgrx":{source:"apache"},"application/x-font-linux-psf":{source:"apache",extensions:["psf"]},"application/x-font-pcf":{source:"apache",extensions:["pcf"]},"application/x-font-snf":{source:"apache",extensions:["snf"]},"application/x-font-speedo":{source:"apache"},"application/x-font-sunos-news":{source:"apache"},"application/x-font-type1":{source:"apache",extensions:["pfa","pfb","pfm","afm"]},"application/x-font-vfont":{source:"apache"},"application/x-freearc":{source:"apache",extensions:["arc"]},"application/x-futuresplash":{source:"apache",extensions:["spl"]},"application/x-gca-compressed":{source:"apache",extensions:["gca"]},"application/x-glulx":{source:"apache",extensions:["ulx"]},"application/x-gnumeric":{source:"apache",extensions:["gnumeric"]},"application/x-gramps-xml":{source:"apache",extensions:["gramps"]},"application/x-gtar":{source:"apache",extensions:["gtar"]},"application/x-gzip":{source:"apache"},"application/x-hdf":{source:"apache",extensions:["hdf"]},"application/x-httpd-php":{compressible:!0,extensions:["php"]},"application/x-install-instructions":{source:"apache",extensions:["install"]},"application/x-ipynb+json":{compressible:!0,extensions:["ipynb"]},"application/x-iso9660-image":{source:"apache",extensions:["iso"]},"application/x-iwork-keynote-sffkey":{extensions:["key"]},"application/x-iwork-numbers-sffnumbers":{extensions:["numbers"]},"application/x-iwork-pages-sffpages":{extensions:["pages"]},"application/x-java-archive-diff":{source:"nginx",extensions:["jardiff"]},"application/x-java-jnlp-file":{source:"apache",compressible:!1,extensions:["jnlp"]},"application/x-javascript":{compressible:!0},"application/x-keepass2":{extensions:["kdbx"]},"application/x-latex":{source:"apache",compressible:!1,extensions:["latex"]},"application/x-lua-bytecode":{extensions:["luac"]},"application/x-lzh-compressed":{source:"apache",extensions:["lzh","lha"]},"application/x-makeself":{source:"nginx",extensions:["run"]},"application/x-mie":{source:"apache",extensions:["mie"]},"application/x-mobipocket-ebook":{source:"apache",extensions:["prc","mobi"]},"application/x-mpegurl":{compressible:!1},"application/x-ms-application":{source:"apache",extensions:["application"]},"application/x-ms-shortcut":{source:"apache",extensions:["lnk"]},"application/x-ms-wmd":{source:"apache",extensions:["wmd"]},"application/x-ms-wmz":{source:"apache",extensions:["wmz"]},"application/x-ms-xbap":{source:"apache",extensions:["xbap"]},"application/x-msaccess":{source:"apache",extensions:["mdb"]},"application/x-msbinder":{source:"apache",extensions:["obd"]},"application/x-mscardfile":{source:"apache",extensions:["crd"]},"application/x-msclip":{source:"apache",extensions:["clp"]},"application/x-msdos-program":{extensions:["exe"]},"application/x-msdownload":{source:"apache",extensions:["exe","dll","com","bat","msi"]},"application/x-msmediaview":{source:"apache",extensions:["mvb","m13","m14"]},"application/x-msmetafile":{source:"apache",extensions:["wmf","wmz","emf","emz"]},"application/x-msmoney":{source:"apache",extensions:["mny"]},"application/x-mspublisher":{source:"apache",extensions:["pub"]},"application/x-msschedule":{source:"apache",extensions:["scd"]},"application/x-msterminal":{source:"apache",extensions:["trm"]},"application/x-mswrite":{source:"apache",extensions:["wri"]},"application/x-netcdf":{source:"apache",extensions:["nc","cdf"]},"application/x-ns-proxy-autoconfig":{compressible:!0,extensions:["pac"]},"application/x-nzb":{source:"apache",extensions:["nzb"]},"application/x-perl":{source:"nginx",extensions:["pl","pm"]},"application/x-pilot":{source:"nginx",extensions:["prc","pdb"]},"application/x-pkcs12":{source:"apache",compressible:!1,extensions:["p12","pfx"]},"application/x-pkcs7-certificates":{source:"apache",extensions:["p7b","spc"]},"application/x-pkcs7-certreqresp":{source:"apache",extensions:["p7r"]},"application/x-pki-message":{source:"iana"},"application/x-rar-compressed":{source:"apache",compressible:!1,extensions:["rar"]},"application/x-redhat-package-manager":{source:"nginx",extensions:["rpm"]},"application/x-research-info-systems":{source:"apache",extensions:["ris"]},"application/x-sea":{source:"nginx",extensions:["sea"]},"application/x-sh":{source:"apache",compressible:!0,extensions:["sh"]},"application/x-shar":{source:"apache",extensions:["shar"]},"application/x-shockwave-flash":{source:"apache",compressible:!1,extensions:["swf"]},"application/x-silverlight-app":{source:"apache",extensions:["xap"]},"application/x-sql":{source:"apache",extensions:["sql"]},"application/x-stuffit":{source:"apache",compressible:!1,extensions:["sit"]},"application/x-stuffitx":{source:"apache",extensions:["sitx"]},"application/x-subrip":{source:"apache",extensions:["srt"]},"application/x-sv4cpio":{source:"apache",extensions:["sv4cpio"]},"application/x-sv4crc":{source:"apache",extensions:["sv4crc"]},"application/x-t3vm-image":{source:"apache",extensions:["t3"]},"application/x-tads":{source:"apache",extensions:["gam"]},"application/x-tar":{source:"apache",compressible:!0,extensions:["tar"]},"application/x-tcl":{source:"apache",extensions:["tcl","tk"]},"application/x-tex":{source:"apache",extensions:["tex"]},"application/x-tex-tfm":{source:"apache",extensions:["tfm"]},"application/x-texinfo":{source:"apache",extensions:["texinfo","texi"]},"application/x-tgif":{source:"apache",extensions:["obj"]},"application/x-ustar":{source:"apache",extensions:["ustar"]},"application/x-virtualbox-hdd":{compressible:!0,extensions:["hdd"]},"application/x-virtualbox-ova":{compressible:!0,extensions:["ova"]},"application/x-virtualbox-ovf":{compressible:!0,extensions:["ovf"]},"application/x-virtualbox-vbox":{compressible:!0,extensions:["vbox"]},"application/x-virtualbox-vbox-extpack":{compressible:!1,extensions:["vbox-extpack"]},"application/x-virtualbox-vdi":{compressible:!0,extensions:["vdi"]},"application/x-virtualbox-vhd":{compressible:!0,extensions:["vhd"]},"application/x-virtualbox-vmdk":{compressible:!0,extensions:["vmdk"]},"application/x-wais-source":{source:"apache",extensions:["src"]},"application/x-web-app-manifest+json":{compressible:!0,extensions:["webapp"]},"application/x-www-form-urlencoded":{source:"iana",compressible:!0},"application/x-x509-ca-cert":{source:"iana",extensions:["der","crt","pem"]},"application/x-x509-ca-ra-cert":{source:"iana"},"application/x-x509-next-ca-cert":{source:"iana"},"application/x-xfig":{source:"apache",extensions:["fig"]},"application/x-xliff+xml":{source:"apache",compressible:!0,extensions:["xlf"]},"application/x-xpinstall":{source:"apache",compressible:!1,extensions:["xpi"]},"application/x-xz":{source:"apache",extensions:["xz"]},"application/x-zip-compressed":{extensions:["zip"]},"application/x-zmachine":{source:"apache",extensions:["z1","z2","z3","z4","z5","z6","z7","z8"]},"application/x400-bp":{source:"iana"},"application/xacml+xml":{source:"iana",compressible:!0},"application/xaml+xml":{source:"apache",compressible:!0,extensions:["xaml"]},"application/xcap-att+xml":{source:"iana",compressible:!0,extensions:["xav"]},"application/xcap-caps+xml":{source:"iana",compressible:!0,extensions:["xca"]},"application/xcap-diff+xml":{source:"iana",compressible:!0,extensions:["xdf"]},"application/xcap-el+xml":{source:"iana",compressible:!0,extensions:["xel"]},"application/xcap-error+xml":{source:"iana",compressible:!0},"application/xcap-ns+xml":{source:"iana",compressible:!0,extensions:["xns"]},"application/xcon-conference-info+xml":{source:"iana",compressible:!0},"application/xcon-conference-info-diff+xml":{source:"iana",compressible:!0},"application/xenc+xml":{source:"iana",compressible:!0,extensions:["xenc"]},"application/xfdf":{source:"iana",extensions:["xfdf"]},"application/xhtml+xml":{source:"iana",compressible:!0,extensions:["xhtml","xht"]},"application/xhtml-voice+xml":{source:"apache",compressible:!0},"application/xliff+xml":{source:"iana",compressible:!0,extensions:["xlf"]},"application/xml":{source:"iana",compressible:!0,extensions:["xml","xsl","xsd","rng"]},"application/xml-dtd":{source:"iana",compressible:!0,extensions:["dtd"]},"application/xml-external-parsed-entity":{source:"iana"},"application/xml-patch+xml":{source:"iana",compressible:!0},"application/xmpp+xml":{source:"iana",compressible:!0},"application/xop+xml":{source:"iana",compressible:!0,extensions:["xop"]},"application/xproc+xml":{source:"apache",compressible:!0,extensions:["xpl"]},"application/xslt+xml":{source:"iana",compressible:!0,extensions:["xsl","xslt"]},"application/xspf+xml":{source:"apache",compressible:!0,extensions:["xspf"]},"application/xv+xml":{source:"iana",compressible:!0,extensions:["mxml","xhvml","xvml","xvm"]},"application/yaml":{source:"iana"},"application/yang":{source:"iana",extensions:["yang"]},"application/yang-data+cbor":{source:"iana"},"application/yang-data+json":{source:"iana",compressible:!0},"application/yang-data+xml":{source:"iana",compressible:!0},"application/yang-patch+json":{source:"iana",compressible:!0},"application/yang-patch+xml":{source:"iana",compressible:!0},"application/yang-sid+json":{source:"iana",compressible:!0},"application/yin+xml":{source:"iana",compressible:!0,extensions:["yin"]},"application/zip":{source:"iana",compressible:!1,extensions:["zip"]},"application/zip+dotlottie":{extensions:["lottie"]},"application/zlib":{source:"iana"},"application/zstd":{source:"iana"},"audio/1d-interleaved-parityfec":{source:"iana"},"audio/32kadpcm":{source:"iana"},"audio/3gpp":{source:"iana",compressible:!1,extensions:["3gpp"]},"audio/3gpp2":{source:"iana"},"audio/aac":{source:"iana",extensions:["adts","aac"]},"audio/ac3":{source:"iana"},"audio/adpcm":{source:"apache",extensions:["adp"]},"audio/amr":{source:"iana",extensions:["amr"]},"audio/amr-wb":{source:"iana"},"audio/amr-wb+":{source:"iana"},"audio/aptx":{source:"iana"},"audio/asc":{source:"iana"},"audio/atrac-advanced-lossless":{source:"iana"},"audio/atrac-x":{source:"iana"},"audio/atrac3":{source:"iana"},"audio/basic":{source:"iana",compressible:!1,extensions:["au","snd"]},"audio/bv16":{source:"iana"},"audio/bv32":{source:"iana"},"audio/clearmode":{source:"iana"},"audio/cn":{source:"iana"},"audio/dat12":{source:"iana"},"audio/dls":{source:"iana"},"audio/dsr-es201108":{source:"iana"},"audio/dsr-es202050":{source:"iana"},"audio/dsr-es202211":{source:"iana"},"audio/dsr-es202212":{source:"iana"},"audio/dv":{source:"iana"},"audio/dvi4":{source:"iana"},"audio/eac3":{source:"iana"},"audio/encaprtp":{source:"iana"},"audio/evrc":{source:"iana"},"audio/evrc-qcp":{source:"iana"},"audio/evrc0":{source:"iana"},"audio/evrc1":{source:"iana"},"audio/evrcb":{source:"iana"},"audio/evrcb0":{source:"iana"},"audio/evrcb1":{source:"iana"},"audio/evrcnw":{source:"iana"},"audio/evrcnw0":{source:"iana"},"audio/evrcnw1":{source:"iana"},"audio/evrcwb":{source:"iana"},"audio/evrcwb0":{source:"iana"},"audio/evrcwb1":{source:"iana"},"audio/evs":{source:"iana"},"audio/flac":{source:"iana"},"audio/flexfec":{source:"iana"},"audio/fwdred":{source:"iana"},"audio/g711-0":{source:"iana"},"audio/g719":{source:"iana"},"audio/g722":{source:"iana"},"audio/g7221":{source:"iana"},"audio/g723":{source:"iana"},"audio/g726-16":{source:"iana"},"audio/g726-24":{source:"iana"},"audio/g726-32":{source:"iana"},"audio/g726-40":{source:"iana"},"audio/g728":{source:"iana"},"audio/g729":{source:"iana"},"audio/g7291":{source:"iana"},"audio/g729d":{source:"iana"},"audio/g729e":{source:"iana"},"audio/gsm":{source:"iana"},"audio/gsm-efr":{source:"iana"},"audio/gsm-hr-08":{source:"iana"},"audio/ilbc":{source:"iana"},"audio/ip-mr_v2.5":{source:"iana"},"audio/isac":{source:"apache"},"audio/l16":{source:"iana"},"audio/l20":{source:"iana"},"audio/l24":{source:"iana",compressible:!1},"audio/l8":{source:"iana"},"audio/lpc":{source:"iana"},"audio/matroska":{source:"iana"},"audio/melp":{source:"iana"},"audio/melp1200":{source:"iana"},"audio/melp2400":{source:"iana"},"audio/melp600":{source:"iana"},"audio/mhas":{source:"iana"},"audio/midi":{source:"apache",extensions:["mid","midi","kar","rmi"]},"audio/midi-clip":{source:"iana"},"audio/mobile-xmf":{source:"iana",extensions:["mxmf"]},"audio/mp3":{compressible:!1,extensions:["mp3"]},"audio/mp4":{source:"iana",compressible:!1,extensions:["m4a","mp4a","m4b"]},"audio/mp4a-latm":{source:"iana"},"audio/mpa":{source:"iana"},"audio/mpa-robust":{source:"iana"},"audio/mpeg":{source:"iana",compressible:!1,extensions:["mpga","mp2","mp2a","mp3","m2a","m3a"]},"audio/mpeg4-generic":{source:"iana"},"audio/musepack":{source:"apache"},"audio/ogg":{source:"iana",compressible:!1,extensions:["oga","ogg","spx","opus"]},"audio/opus":{source:"iana"},"audio/parityfec":{source:"iana"},"audio/pcma":{source:"iana"},"audio/pcma-wb":{source:"iana"},"audio/pcmu":{source:"iana"},"audio/pcmu-wb":{source:"iana"},"audio/prs.sid":{source:"iana"},"audio/qcelp":{source:"iana"},"audio/raptorfec":{source:"iana"},"audio/red":{source:"iana"},"audio/rtp-enc-aescm128":{source:"iana"},"audio/rtp-midi":{source:"iana"},"audio/rtploopback":{source:"iana"},"audio/rtx":{source:"iana"},"audio/s3m":{source:"apache",extensions:["s3m"]},"audio/scip":{source:"iana"},"audio/silk":{source:"apache",extensions:["sil"]},"audio/smv":{source:"iana"},"audio/smv-qcp":{source:"iana"},"audio/smv0":{source:"iana"},"audio/sofa":{source:"iana"},"audio/sp-midi":{source:"iana"},"audio/speex":{source:"iana"},"audio/t140c":{source:"iana"},"audio/t38":{source:"iana"},"audio/telephone-event":{source:"iana"},"audio/tetra_acelp":{source:"iana"},"audio/tetra_acelp_bb":{source:"iana"},"audio/tone":{source:"iana"},"audio/tsvcis":{source:"iana"},"audio/uemclip":{source:"iana"},"audio/ulpfec":{source:"iana"},"audio/usac":{source:"iana"},"audio/vdvi":{source:"iana"},"audio/vmr-wb":{source:"iana"},"audio/vnd.3gpp.iufp":{source:"iana"},"audio/vnd.4sb":{source:"iana"},"audio/vnd.audiokoz":{source:"iana"},"audio/vnd.celp":{source:"iana"},"audio/vnd.cisco.nse":{source:"iana"},"audio/vnd.cmles.radio-events":{source:"iana"},"audio/vnd.cns.anp1":{source:"iana"},"audio/vnd.cns.inf1":{source:"iana"},"audio/vnd.dece.audio":{source:"iana",extensions:["uva","uvva"]},"audio/vnd.digital-winds":{source:"iana",extensions:["eol"]},"audio/vnd.dlna.adts":{source:"iana"},"audio/vnd.dolby.heaac.1":{source:"iana"},"audio/vnd.dolby.heaac.2":{source:"iana"},"audio/vnd.dolby.mlp":{source:"iana"},"audio/vnd.dolby.mps":{source:"iana"},"audio/vnd.dolby.pl2":{source:"iana"},"audio/vnd.dolby.pl2x":{source:"iana"},"audio/vnd.dolby.pl2z":{source:"iana"},"audio/vnd.dolby.pulse.1":{source:"iana"},"audio/vnd.dra":{source:"iana",extensions:["dra"]},"audio/vnd.dts":{source:"iana",extensions:["dts"]},"audio/vnd.dts.hd":{source:"iana",extensions:["dtshd"]},"audio/vnd.dts.uhd":{source:"iana"},"audio/vnd.dvb.file":{source:"iana"},"audio/vnd.everad.plj":{source:"iana"},"audio/vnd.hns.audio":{source:"iana"},"audio/vnd.lucent.voice":{source:"iana",extensions:["lvp"]},"audio/vnd.ms-playready.media.pya":{source:"iana",extensions:["pya"]},"audio/vnd.nokia.mobile-xmf":{source:"iana"},"audio/vnd.nortel.vbk":{source:"iana"},"audio/vnd.nuera.ecelp4800":{source:"iana",extensions:["ecelp4800"]},"audio/vnd.nuera.ecelp7470":{source:"iana",extensions:["ecelp7470"]},"audio/vnd.nuera.ecelp9600":{source:"iana",extensions:["ecelp9600"]},"audio/vnd.octel.sbc":{source:"iana"},"audio/vnd.presonus.multitrack":{source:"iana"},"audio/vnd.qcelp":{source:"apache"},"audio/vnd.rhetorex.32kadpcm":{source:"iana"},"audio/vnd.rip":{source:"iana",extensions:["rip"]},"audio/vnd.rn-realaudio":{compressible:!1},"audio/vnd.sealedmedia.softseal.mpeg":{source:"iana"},"audio/vnd.vmx.cvsd":{source:"iana"},"audio/vnd.wave":{compressible:!1},"audio/vorbis":{source:"iana",compressible:!1},"audio/vorbis-config":{source:"iana"},"audio/wav":{compressible:!1,extensions:["wav"]},"audio/wave":{compressible:!1,extensions:["wav"]},"audio/webm":{source:"apache",compressible:!1,extensions:["weba"]},"audio/x-aac":{source:"apache",compressible:!1,extensions:["aac"]},"audio/x-aiff":{source:"apache",extensions:["aif","aiff","aifc"]},"audio/x-caf":{source:"apache",compressible:!1,extensions:["caf"]},"audio/x-flac":{source:"apache",extensions:["flac"]},"audio/x-m4a":{source:"nginx",extensions:["m4a"]},"audio/x-matroska":{source:"apache",extensions:["mka"]},"audio/x-mpegurl":{source:"apache",extensions:["m3u"]},"audio/x-ms-wax":{source:"apache",extensions:["wax"]},"audio/x-ms-wma":{source:"apache",extensions:["wma"]},"audio/x-pn-realaudio":{source:"apache",extensions:["ram","ra"]},"audio/x-pn-realaudio-plugin":{source:"apache",extensions:["rmp"]},"audio/x-realaudio":{source:"nginx",extensions:["ra"]},"audio/x-tta":{source:"apache"},"audio/x-wav":{source:"apache",extensions:["wav"]},"audio/xm":{source:"apache",extensions:["xm"]},"chemical/x-cdx":{source:"apache",extensions:["cdx"]},"chemical/x-cif":{source:"apache",extensions:["cif"]},"chemical/x-cmdf":{source:"apache",extensions:["cmdf"]},"chemical/x-cml":{source:"apache",extensions:["cml"]},"chemical/x-csml":{source:"apache",extensions:["csml"]},"chemical/x-pdb":{source:"apache"},"chemical/x-xyz":{source:"apache",extensions:["xyz"]},"font/collection":{source:"iana",extensions:["ttc"]},"font/otf":{source:"iana",compressible:!0,extensions:["otf"]},"font/sfnt":{source:"iana"},"font/ttf":{source:"iana",compressible:!0,extensions:["ttf"]},"font/woff":{source:"iana",extensions:["woff"]},"font/woff2":{source:"iana",extensions:["woff2"]},"image/aces":{source:"iana",extensions:["exr"]},"image/apng":{source:"iana",compressible:!1,extensions:["apng"]},"image/avci":{source:"iana",extensions:["avci"]},"image/avcs":{source:"iana",extensions:["avcs"]},"image/avif":{source:"iana",compressible:!1,extensions:["avif"]},"image/bmp":{source:"iana",compressible:!0,extensions:["bmp","dib"]},"image/cgm":{source:"iana",extensions:["cgm"]},"image/dicom-rle":{source:"iana",extensions:["drle"]},"image/dpx":{source:"iana",extensions:["dpx"]},"image/emf":{source:"iana",extensions:["emf"]},"image/fits":{source:"iana",extensions:["fits"]},"image/g3fax":{source:"iana",extensions:["g3"]},"image/gif":{source:"iana",compressible:!1,extensions:["gif"]},"image/heic":{source:"iana",extensions:["heic"]},"image/heic-sequence":{source:"iana",extensions:["heics"]},"image/heif":{source:"iana",extensions:["heif"]},"image/heif-sequence":{source:"iana",extensions:["heifs"]},"image/hej2k":{source:"iana",extensions:["hej2"]},"image/ief":{source:"iana",extensions:["ief"]},"image/j2c":{source:"iana"},"image/jaii":{source:"iana",extensions:["jaii"]},"image/jais":{source:"iana",extensions:["jais"]},"image/jls":{source:"iana",extensions:["jls"]},"image/jp2":{source:"iana",compressible:!1,extensions:["jp2","jpg2"]},"image/jpeg":{source:"iana",compressible:!1,extensions:["jpg","jpeg","jpe"]},"image/jph":{source:"iana",extensions:["jph"]},"image/jphc":{source:"iana",extensions:["jhc"]},"image/jpm":{source:"iana",compressible:!1,extensions:["jpm","jpgm"]},"image/jpx":{source:"iana",compressible:!1,extensions:["jpx","jpf"]},"image/jxl":{source:"iana",extensions:["jxl"]},"image/jxr":{source:"iana",extensions:["jxr"]},"image/jxra":{source:"iana",extensions:["jxra"]},"image/jxrs":{source:"iana",extensions:["jxrs"]},"image/jxs":{source:"iana",extensions:["jxs"]},"image/jxsc":{source:"iana",extensions:["jxsc"]},"image/jxsi":{source:"iana",extensions:["jxsi"]},"image/jxss":{source:"iana",extensions:["jxss"]},"image/ktx":{source:"iana",extensions:["ktx"]},"image/ktx2":{source:"iana",extensions:["ktx2"]},"image/naplps":{source:"iana"},"image/pjpeg":{compressible:!1,extensions:["jfif"]},"image/png":{source:"iana",compressible:!1,extensions:["png"]},"image/prs.btif":{source:"iana",extensions:["btif","btf"]},"image/prs.pti":{source:"iana",extensions:["pti"]},"image/pwg-raster":{source:"iana"},"image/sgi":{source:"apache",extensions:["sgi"]},"image/svg+xml":{source:"iana",compressible:!0,extensions:["svg","svgz"]},"image/t38":{source:"iana",extensions:["t38"]},"image/tiff":{source:"iana",compressible:!1,extensions:["tif","tiff"]},"image/tiff-fx":{source:"iana",extensions:["tfx"]},"image/vnd.adobe.photoshop":{source:"iana",compressible:!0,extensions:["psd"]},"image/vnd.airzip.accelerator.azv":{source:"iana",extensions:["azv"]},"image/vnd.clip":{source:"iana"},"image/vnd.cns.inf2":{source:"iana"},"image/vnd.dece.graphic":{source:"iana",extensions:["uvi","uvvi","uvg","uvvg"]},"image/vnd.djvu":{source:"iana",extensions:["djvu","djv"]},"image/vnd.dvb.subtitle":{source:"iana",extensions:["sub"]},"image/vnd.dwg":{source:"iana",extensions:["dwg"]},"image/vnd.dxf":{source:"iana",extensions:["dxf"]},"image/vnd.fastbidsheet":{source:"iana",extensions:["fbs"]},"image/vnd.fpx":{source:"iana",extensions:["fpx"]},"image/vnd.fst":{source:"iana",extensions:["fst"]},"image/vnd.fujixerox.edmics-mmr":{source:"iana",extensions:["mmr"]},"image/vnd.fujixerox.edmics-rlc":{source:"iana",extensions:["rlc"]},"image/vnd.globalgraphics.pgb":{source:"iana"},"image/vnd.microsoft.icon":{source:"iana",compressible:!0,extensions:["ico"]},"image/vnd.mix":{source:"iana"},"image/vnd.mozilla.apng":{source:"iana"},"image/vnd.ms-dds":{compressible:!0,extensions:["dds"]},"image/vnd.ms-modi":{source:"iana",extensions:["mdi"]},"image/vnd.ms-photo":{source:"apache",extensions:["wdp"]},"image/vnd.net-fpx":{source:"iana",extensions:["npx"]},"image/vnd.pco.b16":{source:"iana",extensions:["b16"]},"image/vnd.radiance":{source:"iana"},"image/vnd.sealed.png":{source:"iana"},"image/vnd.sealedmedia.softseal.gif":{source:"iana"},"image/vnd.sealedmedia.softseal.jpg":{source:"iana"},"image/vnd.svf":{source:"iana"},"image/vnd.tencent.tap":{source:"iana",extensions:["tap"]},"image/vnd.valve.source.texture":{source:"iana",extensions:["vtf"]},"image/vnd.wap.wbmp":{source:"iana",extensions:["wbmp"]},"image/vnd.xiff":{source:"iana",extensions:["xif"]},"image/vnd.zbrush.pcx":{source:"iana",extensions:["pcx"]},"image/webp":{source:"iana",extensions:["webp"]},"image/wmf":{source:"iana",extensions:["wmf"]},"image/x-3ds":{source:"apache",extensions:["3ds"]},"image/x-adobe-dng":{extensions:["dng"]},"image/x-cmu-raster":{source:"apache",extensions:["ras"]},"image/x-cmx":{source:"apache",extensions:["cmx"]},"image/x-emf":{source:"iana"},"image/x-freehand":{source:"apache",extensions:["fh","fhc","fh4","fh5","fh7"]},"image/x-icon":{source:"apache",compressible:!0,extensions:["ico"]},"image/x-jng":{source:"nginx",extensions:["jng"]},"image/x-mrsid-image":{source:"apache",extensions:["sid"]},"image/x-ms-bmp":{source:"nginx",compressible:!0,extensions:["bmp"]},"image/x-pcx":{source:"apache",extensions:["pcx"]},"image/x-pict":{source:"apache",extensions:["pic","pct"]},"image/x-portable-anymap":{source:"apache",extensions:["pnm"]},"image/x-portable-bitmap":{source:"apache",extensions:["pbm"]},"image/x-portable-graymap":{source:"apache",extensions:["pgm"]},"image/x-portable-pixmap":{source:"apache",extensions:["ppm"]},"image/x-rgb":{source:"apache",extensions:["rgb"]},"image/x-tga":{source:"apache",extensions:["tga"]},"image/x-wmf":{source:"iana"},"image/x-xbitmap":{source:"apache",extensions:["xbm"]},"image/x-xcf":{compressible:!1},"image/x-xpixmap":{source:"apache",extensions:["xpm"]},"image/x-xwindowdump":{source:"apache",extensions:["xwd"]},"message/bhttp":{source:"iana"},"message/cpim":{source:"iana"},"message/delivery-status":{source:"iana"},"message/disposition-notification":{source:"iana",extensions:["disposition-notification"]},"message/external-body":{source:"iana"},"message/feedback-report":{source:"iana"},"message/global":{source:"iana",extensions:["u8msg"]},"message/global-delivery-status":{source:"iana",extensions:["u8dsn"]},"message/global-disposition-notification":{source:"iana",extensions:["u8mdn"]},"message/global-headers":{source:"iana",extensions:["u8hdr"]},"message/http":{source:"iana",compressible:!1},"message/imdn+xml":{source:"iana",compressible:!0},"message/mls":{source:"iana"},"message/news":{source:"apache"},"message/ohttp-req":{source:"iana"},"message/ohttp-res":{source:"iana"},"message/partial":{source:"iana",compressible:!1},"message/rfc822":{source:"iana",compressible:!0,extensions:["eml","mime","mht","mhtml"]},"message/s-http":{source:"apache"},"message/sip":{source:"iana"},"message/sipfrag":{source:"iana"},"message/tracking-status":{source:"iana"},"message/vnd.si.simp":{source:"apache"},"message/vnd.wfa.wsc":{source:"iana",extensions:["wsc"]},"model/3mf":{source:"iana",extensions:["3mf"]},"model/e57":{source:"iana"},"model/gltf+json":{source:"iana",compressible:!0,extensions:["gltf"]},"model/gltf-binary":{source:"iana",compressible:!0,extensions:["glb"]},"model/iges":{source:"iana",compressible:!1,extensions:["igs","iges"]},"model/jt":{source:"iana",extensions:["jt"]},"model/mesh":{source:"iana",compressible:!1,extensions:["msh","mesh","silo"]},"model/mtl":{source:"iana",extensions:["mtl"]},"model/obj":{source:"iana",extensions:["obj"]},"model/prc":{source:"iana",extensions:["prc"]},"model/step":{source:"iana",extensions:["step","stp","stpnc","p21","210"]},"model/step+xml":{source:"iana",compressible:!0,extensions:["stpx"]},"model/step+zip":{source:"iana",compressible:!1,extensions:["stpz"]},"model/step-xml+zip":{source:"iana",compressible:!1,extensions:["stpxz"]},"model/stl":{source:"iana",extensions:["stl"]},"model/u3d":{source:"iana",extensions:["u3d"]},"model/vnd.bary":{source:"iana",extensions:["bary"]},"model/vnd.cld":{source:"iana",extensions:["cld"]},"model/vnd.collada+xml":{source:"iana",compressible:!0,extensions:["dae"]},"model/vnd.dwf":{source:"iana",extensions:["dwf"]},"model/vnd.flatland.3dml":{source:"iana"},"model/vnd.gdl":{source:"iana",extensions:["gdl"]},"model/vnd.gs-gdl":{source:"apache"},"model/vnd.gs.gdl":{source:"iana"},"model/vnd.gtw":{source:"iana",extensions:["gtw"]},"model/vnd.moml+xml":{source:"iana",compressible:!0},"model/vnd.mts":{source:"iana",extensions:["mts"]},"model/vnd.opengex":{source:"iana",extensions:["ogex"]},"model/vnd.parasolid.transmit.binary":{source:"iana",extensions:["x_b"]},"model/vnd.parasolid.transmit.text":{source:"iana",extensions:["x_t"]},"model/vnd.pytha.pyox":{source:"iana",extensions:["pyo","pyox"]},"model/vnd.rosette.annotated-data-model":{source:"iana"},"model/vnd.sap.vds":{source:"iana",extensions:["vds"]},"model/vnd.usda":{source:"iana",extensions:["usda"]},"model/vnd.usdz+zip":{source:"iana",compressible:!1,extensions:["usdz"]},"model/vnd.valve.source.compiled-map":{source:"iana",extensions:["bsp"]},"model/vnd.vtu":{source:"iana",extensions:["vtu"]},"model/vrml":{source:"iana",compressible:!1,extensions:["wrl","vrml"]},"model/x3d+binary":{source:"apache",compressible:!1,extensions:["x3db","x3dbz"]},"model/x3d+fastinfoset":{source:"iana",extensions:["x3db"]},"model/x3d+vrml":{source:"apache",compressible:!1,extensions:["x3dv","x3dvz"]},"model/x3d+xml":{source:"iana",compressible:!0,extensions:["x3d","x3dz"]},"model/x3d-vrml":{source:"iana",extensions:["x3dv"]},"multipart/alternative":{source:"iana",compressible:!1},"multipart/appledouble":{source:"iana"},"multipart/byteranges":{source:"iana"},"multipart/digest":{source:"iana"},"multipart/encrypted":{source:"iana",compressible:!1},"multipart/form-data":{source:"iana",compressible:!1},"multipart/header-set":{source:"iana"},"multipart/mixed":{source:"iana"},"multipart/multilingual":{source:"iana"},"multipart/parallel":{source:"iana"},"multipart/related":{source:"iana",compressible:!1},"multipart/report":{source:"iana"},"multipart/signed":{source:"iana",compressible:!1},"multipart/vnd.bint.med-plus":{source:"iana"},"multipart/voice-message":{source:"iana"},"multipart/x-mixed-replace":{source:"iana"},"text/1d-interleaved-parityfec":{source:"iana"},"text/cache-manifest":{source:"iana",compressible:!0,extensions:["appcache","manifest"]},"text/calendar":{source:"iana",extensions:["ics","ifb"]},"text/calender":{compressible:!0},"text/cmd":{compressible:!0},"text/coffeescript":{extensions:["coffee","litcoffee"]},"text/cql":{source:"iana"},"text/cql-expression":{source:"iana"},"text/cql-identifier":{source:"iana"},"text/css":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["css"]},"text/csv":{source:"iana",compressible:!0,extensions:["csv"]},"text/csv-schema":{source:"iana"},"text/directory":{source:"iana"},"text/dns":{source:"iana"},"text/ecmascript":{source:"apache"},"text/encaprtp":{source:"iana"},"text/enriched":{source:"iana"},"text/fhirpath":{source:"iana"},"text/flexfec":{source:"iana"},"text/fwdred":{source:"iana"},"text/gff3":{source:"iana"},"text/grammar-ref-list":{source:"iana"},"text/hl7v2":{source:"iana"},"text/html":{source:"iana",compressible:!0,extensions:["html","htm","shtml"]},"text/jade":{extensions:["jade"]},"text/javascript":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["js","mjs"]},"text/jcr-cnd":{source:"iana"},"text/jsx":{compressible:!0,extensions:["jsx"]},"text/less":{compressible:!0,extensions:["less"]},"text/markdown":{source:"iana",compressible:!0,extensions:["md","markdown"]},"text/mathml":{source:"nginx",extensions:["mml"]},"text/mdx":{compressible:!0,extensions:["mdx"]},"text/mizar":{source:"iana"},"text/n3":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["n3"]},"text/parameters":{source:"iana",charset:"UTF-8"},"text/parityfec":{source:"iana"},"text/plain":{source:"iana",compressible:!0,extensions:["txt","text","conf","def","list","log","in","ini"]},"text/provenance-notation":{source:"iana",charset:"UTF-8"},"text/prs.fallenstein.rst":{source:"iana"},"text/prs.lines.tag":{source:"iana",extensions:["dsc"]},"text/prs.prop.logic":{source:"iana"},"text/prs.texi":{source:"iana"},"text/raptorfec":{source:"iana"},"text/red":{source:"iana"},"text/rfc822-headers":{source:"iana"},"text/richtext":{source:"iana",compressible:!0,extensions:["rtx"]},"text/rtf":{source:"iana",compressible:!0,extensions:["rtf"]},"text/rtp-enc-aescm128":{source:"iana"},"text/rtploopback":{source:"iana"},"text/rtx":{source:"iana"},"text/sgml":{source:"iana",extensions:["sgml","sgm"]},"text/shaclc":{source:"iana"},"text/shex":{source:"iana",extensions:["shex"]},"text/slim":{extensions:["slim","slm"]},"text/spdx":{source:"iana",extensions:["spdx"]},"text/strings":{source:"iana"},"text/stylus":{extensions:["stylus","styl"]},"text/t140":{source:"iana"},"text/tab-separated-values":{source:"iana",compressible:!0,extensions:["tsv"]},"text/troff":{source:"iana",extensions:["t","tr","roff","man","me","ms"]},"text/turtle":{source:"iana",charset:"UTF-8",extensions:["ttl"]},"text/ulpfec":{source:"iana"},"text/uri-list":{source:"iana",compressible:!0,extensions:["uri","uris","urls"]},"text/vcard":{source:"iana",compressible:!0,extensions:["vcard"]},"text/vnd.a":{source:"iana"},"text/vnd.abc":{source:"iana"},"text/vnd.ascii-art":{source:"iana"},"text/vnd.curl":{source:"iana",extensions:["curl"]},"text/vnd.curl.dcurl":{source:"apache",extensions:["dcurl"]},"text/vnd.curl.mcurl":{source:"apache",extensions:["mcurl"]},"text/vnd.curl.scurl":{source:"apache",extensions:["scurl"]},"text/vnd.debian.copyright":{source:"iana",charset:"UTF-8"},"text/vnd.dmclientscript":{source:"iana"},"text/vnd.dvb.subtitle":{source:"iana",extensions:["sub"]},"text/vnd.esmertec.theme-descriptor":{source:"iana",charset:"UTF-8"},"text/vnd.exchangeable":{source:"iana"},"text/vnd.familysearch.gedcom":{source:"iana",extensions:["ged"]},"text/vnd.ficlab.flt":{source:"iana"},"text/vnd.fly":{source:"iana",extensions:["fly"]},"text/vnd.fmi.flexstor":{source:"iana",extensions:["flx"]},"text/vnd.gml":{source:"iana"},"text/vnd.graphviz":{source:"iana",extensions:["gv"]},"text/vnd.hans":{source:"iana"},"text/vnd.hgl":{source:"iana"},"text/vnd.in3d.3dml":{source:"iana",extensions:["3dml"]},"text/vnd.in3d.spot":{source:"iana",extensions:["spot"]},"text/vnd.iptc.newsml":{source:"iana"},"text/vnd.iptc.nitf":{source:"iana"},"text/vnd.latex-z":{source:"iana"},"text/vnd.motorola.reflex":{source:"iana"},"text/vnd.ms-mediapackage":{source:"iana"},"text/vnd.net2phone.commcenter.command":{source:"iana"},"text/vnd.radisys.msml-basic-layout":{source:"iana"},"text/vnd.senx.warpscript":{source:"iana"},"text/vnd.si.uricatalogue":{source:"apache"},"text/vnd.sosi":{source:"iana"},"text/vnd.sun.j2me.app-descriptor":{source:"iana",charset:"UTF-8",extensions:["jad"]},"text/vnd.trolltech.linguist":{source:"iana",charset:"UTF-8"},"text/vnd.vcf":{source:"iana"},"text/vnd.wap.si":{source:"iana"},"text/vnd.wap.sl":{source:"iana"},"text/vnd.wap.wml":{source:"iana",extensions:["wml"]},"text/vnd.wap.wmlscript":{source:"iana",extensions:["wmls"]},"text/vnd.zoo.kcl":{source:"iana"},"text/vtt":{source:"iana",charset:"UTF-8",compressible:!0,extensions:["vtt"]},"text/wgsl":{source:"iana",extensions:["wgsl"]},"text/x-asm":{source:"apache",extensions:["s","asm"]},"text/x-c":{source:"apache",extensions:["c","cc","cxx","cpp","h","hh","dic"]},"text/x-component":{source:"nginx",extensions:["htc"]},"text/x-fortran":{source:"apache",extensions:["f","for","f77","f90"]},"text/x-gwt-rpc":{compressible:!0},"text/x-handlebars-template":{extensions:["hbs"]},"text/x-java-source":{source:"apache",extensions:["java"]},"text/x-jquery-tmpl":{compressible:!0},"text/x-lua":{extensions:["lua"]},"text/x-markdown":{compressible:!0,extensions:["mkd"]},"text/x-nfo":{source:"apache",extensions:["nfo"]},"text/x-opml":{source:"apache",extensions:["opml"]},"text/x-org":{compressible:!0,extensions:["org"]},"text/x-pascal":{source:"apache",extensions:["p","pas"]},"text/x-processing":{compressible:!0,extensions:["pde"]},"text/x-sass":{extensions:["sass"]},"text/x-scss":{extensions:["scss"]},"text/x-setext":{source:"apache",extensions:["etx"]},"text/x-sfv":{source:"apache",extensions:["sfv"]},"text/x-suse-ymp":{compressible:!0,extensions:["ymp"]},"text/x-uuencode":{source:"apache",extensions:["uu"]},"text/x-vcalendar":{source:"apache",extensions:["vcs"]},"text/x-vcard":{source:"apache",extensions:["vcf"]},"text/xml":{source:"iana",compressible:!0,extensions:["xml"]},"text/xml-external-parsed-entity":{source:"iana"},"text/yaml":{compressible:!0,extensions:["yaml","yml"]},"video/1d-interleaved-parityfec":{source:"iana"},"video/3gpp":{source:"iana",extensions:["3gp","3gpp"]},"video/3gpp-tt":{source:"iana"},"video/3gpp2":{source:"iana",extensions:["3g2"]},"video/av1":{source:"iana"},"video/bmpeg":{source:"iana"},"video/bt656":{source:"iana"},"video/celb":{source:"iana"},"video/dv":{source:"iana"},"video/encaprtp":{source:"iana"},"video/evc":{source:"iana"},"video/ffv1":{source:"iana"},"video/flexfec":{source:"iana"},"video/h261":{source:"iana",extensions:["h261"]},"video/h263":{source:"iana",extensions:["h263"]},"video/h263-1998":{source:"iana"},"video/h263-2000":{source:"iana"},"video/h264":{source:"iana",extensions:["h264"]},"video/h264-rcdo":{source:"iana"},"video/h264-svc":{source:"iana"},"video/h265":{source:"iana"},"video/h266":{source:"iana"},"video/iso.segment":{source:"iana",extensions:["m4s"]},"video/jpeg":{source:"iana",extensions:["jpgv"]},"video/jpeg2000":{source:"iana"},"video/jpm":{source:"apache",extensions:["jpm","jpgm"]},"video/jxsv":{source:"iana"},"video/lottie+json":{source:"iana",compressible:!0},"video/matroska":{source:"iana"},"video/matroska-3d":{source:"iana"},"video/mj2":{source:"iana",extensions:["mj2","mjp2"]},"video/mp1s":{source:"iana"},"video/mp2p":{source:"iana"},"video/mp2t":{source:"iana",extensions:["ts","m2t","m2ts","mts"]},"video/mp4":{source:"iana",compressible:!1,extensions:["mp4","mp4v","mpg4"]},"video/mp4v-es":{source:"iana"},"video/mpeg":{source:"iana",compressible:!1,extensions:["mpeg","mpg","mpe","m1v","m2v"]},"video/mpeg4-generic":{source:"iana"},"video/mpv":{source:"iana"},"video/nv":{source:"iana"},"video/ogg":{source:"iana",compressible:!1,extensions:["ogv"]},"video/parityfec":{source:"iana"},"video/pointer":{source:"iana"},"video/quicktime":{source:"iana",compressible:!1,extensions:["qt","mov"]},"video/raptorfec":{source:"iana"},"video/raw":{source:"iana"},"video/rtp-enc-aescm128":{source:"iana"},"video/rtploopback":{source:"iana"},"video/rtx":{source:"iana"},"video/scip":{source:"iana"},"video/smpte291":{source:"iana"},"video/smpte292m":{source:"iana"},"video/ulpfec":{source:"iana"},"video/vc1":{source:"iana"},"video/vc2":{source:"iana"},"video/vnd.cctv":{source:"iana"},"video/vnd.dece.hd":{source:"iana",extensions:["uvh","uvvh"]},"video/vnd.dece.mobile":{source:"iana",extensions:["uvm","uvvm"]},"video/vnd.dece.mp4":{source:"iana"},"video/vnd.dece.pd":{source:"iana",extensions:["uvp","uvvp"]},"video/vnd.dece.sd":{source:"iana",extensions:["uvs","uvvs"]},"video/vnd.dece.video":{source:"iana",extensions:["uvv","uvvv"]},"video/vnd.directv.mpeg":{source:"iana"},"video/vnd.directv.mpeg-tts":{source:"iana"},"video/vnd.dlna.mpeg-tts":{source:"iana"},"video/vnd.dvb.file":{source:"iana",extensions:["dvb"]},"video/vnd.fvt":{source:"iana",extensions:["fvt"]},"video/vnd.hns.video":{source:"iana"},"video/vnd.iptvforum.1dparityfec-1010":{source:"iana"},"video/vnd.iptvforum.1dparityfec-2005":{source:"iana"},"video/vnd.iptvforum.2dparityfec-1010":{source:"iana"},"video/vnd.iptvforum.2dparityfec-2005":{source:"iana"},"video/vnd.iptvforum.ttsavc":{source:"iana"},"video/vnd.iptvforum.ttsmpeg2":{source:"iana"},"video/vnd.motorola.video":{source:"iana"},"video/vnd.motorola.videop":{source:"iana"},"video/vnd.mpegurl":{source:"iana",extensions:["mxu","m4u"]},"video/vnd.ms-playready.media.pyv":{source:"iana",extensions:["pyv"]},"video/vnd.nokia.interleaved-multimedia":{source:"iana"},"video/vnd.nokia.mp4vr":{source:"iana"},"video/vnd.nokia.videovoip":{source:"iana"},"video/vnd.objectvideo":{source:"iana"},"video/vnd.planar":{source:"iana"},"video/vnd.radgamettools.bink":{source:"iana"},"video/vnd.radgamettools.smacker":{source:"apache"},"video/vnd.sealed.mpeg1":{source:"iana"},"video/vnd.sealed.mpeg4":{source:"iana"},"video/vnd.sealed.swf":{source:"iana"},"video/vnd.sealedmedia.softseal.mov":{source:"iana"},"video/vnd.uvvu.mp4":{source:"iana",extensions:["uvu","uvvu"]},"video/vnd.vivo":{source:"iana",extensions:["viv"]},"video/vnd.youtube.yt":{source:"iana"},"video/vp8":{source:"iana"},"video/vp9":{source:"iana"},"video/webm":{source:"apache",compressible:!1,extensions:["webm"]},"video/x-f4v":{source:"apache",extensions:["f4v"]},"video/x-fli":{source:"apache",extensions:["fli"]},"video/x-flv":{source:"apache",compressible:!1,extensions:["flv"]},"video/x-m4v":{source:"apache",extensions:["m4v"]},"video/x-matroska":{source:"apache",compressible:!1,extensions:["mkv","mk3d","mks"]},"video/x-mng":{source:"apache",extensions:["mng"]},"video/x-ms-asf":{source:"apache",extensions:["asf","asx"]},"video/x-ms-vob":{source:"apache",extensions:["vob"]},"video/x-ms-wm":{source:"apache",extensions:["wm"]},"video/x-ms-wmv":{source:"apache",compressible:!1,extensions:["wmv"]},"video/x-ms-wmx":{source:"apache",extensions:["wmx"]},"video/x-ms-wvx":{source:"apache",extensions:["wvx"]},"video/x-msvideo":{source:"apache",extensions:["avi"]},"video/x-sgi-movie":{source:"apache",extensions:["movie"]},"video/x-smv":{source:"apache",extensions:["smv"]},"x-conference/x-cooltalk":{source:"apache",extensions:["ice"]},"x-shader/x-fragment":{compressible:!0},"x-shader/x-vertex":{compressible:!0}};function requireMimeDb(){return hasRequiredMimeDb?mimeDb:(hasRequiredMimeDb=1,mimeDb=require$$0$1)}function requireMimeScore(){if(hasRequiredMimeScore)return mimeScore;hasRequiredMimeScore=1;var e={"prs.":100,"x-":200,"x.":300,"vnd.":400,default:900},a={nginx:10,apache:20,iana:40,default:30},n={application:1,font:2,audio:2,video:3,default:0};return mimeScore=function(t,s="default"){if("application/octet-stream"===t)return 0;const[i,o]=t.split("/"),r=o.replace(/(\.|x-).*/,"$1");return(e[r]||e.default)+(a[s]||a.default)+(n[i]||n.default)+(1-t.length/100)}}function requireMimeTypes(){return hasRequiredMimeTypes||(hasRequiredMimeTypes=1,function(e){var a,n,t=requireMimeDb(),s=path.extname,i=requireMimeScore(),o=/^\s*([^;\s]*)(?:;|\s|$)/,r=/^text\//i;function c(e){if(!e||"string"!=typeof e)return!1;var a=o.exec(e),n=a&&t[a[1].toLowerCase()];return n&&n.charset?n.charset:!(!a||!r.test(a[1]))&&"UTF-8"}function p(a){if(!a||"string"!=typeof a)return!1;var n=o.exec(a),t=n&&e.extensions[n[1].toLowerCase()];return!(!t||!t.length)&&t[0]}function l(e,a,n){return(a?i(a,t[a].source):0)>(n?i(n,t[n].source):0)?a:n}function d(a,n,s){var i=["nginx","apache",void 0,"iana"],o=n?i.indexOf(t[n].source):0,r=s?i.indexOf(t[s].source):0;return"application/octet-stream"!==e.types[p]&&(o>r||o===r&&"application/"===e.types[p]?.slice(0,12))||o>r?n:s}e.charset=c,e.charsets={lookup:c},e.contentType=function(a){if(!a||"string"!=typeof a)return!1;var n=-1===a.indexOf("/")?e.lookup(a):a;if(!n)return!1;if(-1===n.indexOf("charset")){var t=e.charset(n);t&&(n+="; charset="+t.toLowerCase())}return n},e.extension=p,e.extensions=Object.create(null),e.lookup=function(a){if(!a||"string"!=typeof a)return!1;var n=s("x."+a).toLowerCase().slice(1);return n&&e.types[n]||!1},e.types=Object.create(null),e._extensionConflicts=[],a=e.extensions,n=e.types,Object.keys(t).forEach(function(s){var i=t[s].extensions;if(i&&i.length){a[s]=i;for(var o=0;o<i.length;o++){var r=i[o];n[r]=l(0,n[r],s);const a=d(0,n[r],s);a!==n[r]&&e._extensionConflicts.push([r,a,n[r]])}}})}(mimeTypes)),mimeTypes}var mimeTypesExports=requireMimeTypes();async function decryptDataEncryptionKey(e){try{const a=await _package.machine.getSecretKey();if(!a)return _package.logger.warn("[WORKSPACE] Machine secret key not available"),null;const n=shared.decodeBase64(e);return shared.decryptWithEphemeralKey(n,a)||(_package.logger.warn("[WORKSPACE] Failed to decrypt dataEncryptionKey"),null)}catch(e){return _package.logger.warn("[WORKSPACE] Error decrypting dataEncryptionKey:",e),null}}function resolveFilePath$1(e,a,n){return _package.machine.resolveWorkspaceFilePath(e,a,n)}function sendResponse(e,a){e?e.send("workspace-file-response",a):_package.logger.error("[WORKSPACE] Cannot send workspace-file-response: client not available")}function createErrorResponse(e,a,n,t){return{eventId:shared.createEventId(),requestId:e,taskId:a,success:!1,error:{code:n,message:t}}}function handleNotModified(e,a,n,t){_package.logger.debug(`[WORKSPACE] File not modified: ${t}`),sendResponse(e,{eventId:shared.createEventId(),requestId:a,taskId:n,success:!0,notModified:!0})}async function handleDirectory(e,a,n,t,s,i){const o=await fs__namespace.promises.readdir(t,{withFileTypes:!0}),r=await Promise.all(o.map(async e=>{const a=path__namespace.join(t,e.name),n=await fs__namespace.promises.stat(a);return{name:e.name,type:e.isDirectory()?"directory":"file",size:n.size,modifiedAt:n.mtime.toISOString(),accessDenied:n.size>i}}));sendResponse(e,{eventId:shared.createEventId(),requestId:a,taskId:n,success:!0,data:{type:"directory",entries:r,metadata:{size:0,modifiedAt:s.mtime.toISOString()}}})}function handleFileTooLarge(e,a,n,t,s,i,o){_package.logger.warn(`[WORKSPACE] File too large (${s.size} bytes > ${o} bytes): ${t}`),sendResponse(e,{eventId:shared.createEventId(),requestId:a,taskId:n,success:!0,data:{type:"file",metadata:{size:s.size,mimeType:i,modifiedAt:s.mtime.toISOString(),accessDenied:!0}}})}async function handleFile(e,a,n,t,s,i){const o=mimeTypesExports.lookup(t)||"application/octet-stream",r=(await fs__namespace.promises.readFile(t)).toString("base64");let c=null;i&&(c=await decryptDataEncryptionKey(i));const p={type:"file",metadata:{size:s.size,mimeType:o,modifiedAt:s.mtime.toISOString()}};c?p.encryptedContent=shared.encryptFileContent(r,c):p.content=r,sendResponse(e,{eventId:shared.createEventId(),requestId:a,taskId:n,success:!0,data:p})}function workspaceFileRequestHandler(e){return async a=>{const{taskId:n,userId:t,relativePath:s,requestId:i,maxFileSizeMB:o,ifModifiedSince:r,dataEncryptionKey:c}=a;_package.logger.debug(`[WORKSPACE] File request: taskId=${n}, userId=${t}, relativePath=${s}, maxFileSizeMB=${o}, ifModifiedSince=${r}, hasEncryptionKey=${!!c}`);try{const a=1024*(o||10)*1024,p=resolveFilePath$1(t,n,s);if(!fs__namespace.existsSync(p))return _package.logger.warn(`[WORKSPACE] File not found: ${p}`),void sendResponse(e.client,createErrorResponse(i,n,"file_not_found","File or directory not found"));const l=await fs__namespace.promises.stat(p),d=l.mtime.toISOString();if(r&&d===r)return void handleNotModified(e.client,i,n,p);if(l.isDirectory())return void await handleDirectory(e.client,i,n,p,l,a);{const t=mimeTypesExports.lookup(p)||"application/octet-stream";return l.size>a?void handleFileTooLarge(e.client,i,n,p,l,t,a):void await handleFile(e.client,i,n,p,l,c)}}catch(a){_package.logger.error(`[WORKSPACE] Failed to handle workspace-file-request: ${a.message}`,a);const t="ENOENT"===a.code?"file_not_found":"EACCES"===a.code?"permission_denied":"unknown_error";sendResponse(e.client,createErrorResponse(i,n,t,a.message))}}}const CREDENTIALS_DIR=path$1.join(_package.machine.agentrixHomeDir,"credentials"),ALGORITHM="aes-256-gcm";function getPatFilePath(e){return path$1.join(CREDENTIALS_DIR,`${e}.pat.enc`)}function getPatMetaFilePath(e){return path$1.join(CREDENTIALS_DIR,`${e}.pat.meta.json`)}function loadPatMeta(e){const a=getPatMetaFilePath(e);if(!fs$1.existsSync(a))return null;try{return JSON.parse(fs$1.readFileSync(a,"utf8"))}catch{return null}}function loadPat(e,a){const n=getPatFilePath(e);if(!fs$1.existsSync(n))return null;try{const e=fs$1.readFileSync(n,"utf8"),{iv:t,authTag:s,encrypted:i}=JSON.parse(e),o=a.slice(0,32),r=node_crypto.createDecipheriv(ALGORITHM,o,Buffer.from(t,"hex"));r.setAuthTag(Buffer.from(s,"hex"));let c=r.update(i,"hex","utf8");return c+=r.final("utf8"),c}catch{return null}}const PROXY_ALLOWLIST=[{method:"GET",pattern:/^\/projects$/},{method:"GET",pattern:/^\/projects\/[^/]+\/repository\/branches$/},{method:"GET",pattern:/^\/projects\/[^/]+\/issues$/},{method:"GET",pattern:/^\/projects\/[^/]+\/issues\/\d+$/},{method:"GET",pattern:/^\/projects\/[^/]+\/merge_requests$/},{method:"GET",pattern:/^\/projects\/[^/]+\/merge_requests\/\d+$/},{method:"POST",pattern:/^\/projects\/[^/]+\/merge_requests$/}];class GitLabExecutor{apiUrl;pat;requestId;gitServerId;constructor(e,a,n){this.apiUrl=e,this.pat=a,this.requestId=n?.requestId,this.gitServerId=n?.gitServerId}logPrefix(){return`[GITLAB EXECUTOR] reqId=${this.requestId??"-"}, gitServer=${this.gitServerId??"-"}`}summarizeResult(e,a){if(Array.isArray(a))return`items=${a.length}`;if(a&&"object"==typeof a){const n=a;return"resolveGitAuthContext"===e?`authMode=${String(n.authMode??"unknown")}, hasPat=${Boolean(n.hasPat)}`:"number"in n||"state"in n?`number=${String(n.number??"-")}, state=${String(n.state??"-")}`:`keys=${Object.keys(n).join(",")||"-"}`}return"type="+typeof a}truncateText(e,a=300){return e.length<=a?e:`${e.slice(0,a)}...`}async request(e,a="GET",n){const t=`${this.apiUrl}${e}`,s={Authorization:`Bearer ${this.pat}`,"Content-Type":"application/json"},i=Date.now();_package.logger.debug(`${this.logPrefix()} request start: ${a} ${e}`);try{const o=await fetch(t,{method:a,headers:s,body:n?JSON.stringify(n):void 0}),r=Date.now()-i;if(!o.ok){const n=await o.text().catch(()=>"Unknown error"),t=this.truncateText(n);throw _package.logger.warn(`${this.logPrefix()} request failed: ${a} ${e}, status=${o.status}, elapsedMs=${r}, detail=${t}`),{status:o.status,message:`GitLab API error: ${o.status} ${o.statusText}`,detail:t}}return _package.logger.debug(`${this.logPrefix()} request success: ${a} ${e}, elapsedMs=${r}`),await o.json()}catch(n){if("object"==typeof n&&null!==n&&"status"in n)throw n;const t=n instanceof Error?n.message:"Unknown network error";throw _package.logger.error(`${this.logPrefix()} request exception: ${a} ${e}, message=${t}`),{status:0,message:`GitLab request failed: ${t}`}}}async executeOperation(e,a){_package.logger.info(`${this.logPrefix()} execute operation: op=${e}, payloadKeys=${Object.keys(a||{}).join(",")||"-"}`);try{let n;switch(e){case"listRepos":n=await this.listRepos();break;case"listBranches":n=await this.listBranches(a.owner,a.name);break;case"createMergeRequest":n=await this.createMergeRequest(a);break;case"getMergeRequest":n=await this.getMergeRequest(a.owner,a.name,a.iid);break;case"listMergeRequests":n=await this.listMergeRequests(a.owner,a.name);break;case"requestGitlabApi":n=await this.requestGitlabApi(a);break;case"resolveGitAuthContext":n={authMode:"local_pat",hasPat:!0};break;default:throw{status:400,message:`Unknown operation: ${e}`}}return _package.logger.info(`${this.logPrefix()} operation success: op=${e}, summary=${this.summarizeResult(e,n)}`),n}catch(a){const n=a instanceof Error?a.message:"object"==typeof a&&null!==a&&"message"in a?String(a.message):"Unknown error";throw _package.logger.error(`${this.logPrefix()} operation failed: op=${e}, message=${n}`),a}}async listRepos(){return(await this.request("/projects?membership=true&per_page=100&order_by=updated_at&sort=desc")).map(e=>({id:e.id,owner:e.namespace.path,name:e.path,fullName:e.path_with_namespace,defaultBranch:e.default_branch,isPrivate:"private"===e.visibility,description:e.description,url:e.web_url,createdAt:e.created_at,updatedAt:e.updated_at}))}async listBranches(e,a){const n=encodeURIComponent(`${e}/${a}`);return(await this.request(`/projects/${n}/repository/branches?per_page=100`)).map(e=>({name:e.name,commit:{sha:e.commit.id,url:""},protected:e.protected}))}async createMergeRequest(e){const a=encodeURIComponent(`${e.owner}/${e.repo}`),n=await this.request(`/projects/${a}/merge_requests`,"POST",{source_branch:e.head,target_branch:e.base,title:e.title,description:e.body||""});return{number:n.iid,title:n.title,body:n.description,state:"opened"===n.state?"open":n.state,url:n.web_url,head:n.source_branch,base:n.target_branch,createdAt:n.created_at,updatedAt:n.updated_at}}async getMergeRequest(e,a,n){const t=encodeURIComponent(`${e}/${a}`),s=await this.request(`/projects/${t}/merge_requests/${n}`);return{number:s.iid,title:s.title,body:s.description,state:"opened"===s.state?"open":s.state,url:s.web_url,head:s.source_branch,base:s.target_branch,createdAt:s.created_at,updatedAt:s.updated_at}}async listMergeRequests(e,a){const n=encodeURIComponent(`${e}/${a}`);return(await this.request(`/projects/${n}/merge_requests?state=opened&per_page=20`)).map(e=>({number:e.iid,title:e.title,body:e.description,state:"opened"===e.state?"open":e.state,url:e.web_url,head:e.source_branch,base:e.target_branch,createdAt:e.created_at,updatedAt:e.updated_at}))}parseProxyMethod(e){const a="string"==typeof e?e.toUpperCase():"GET";if("GET"===a||"POST"===a||"PUT"===a||"PATCH"===a||"DELETE"===a)return a;throw{status:400,message:`Unsupported proxy method: ${String(e)}`}}parseProxyPath(e){if("string"!=typeof e||0===e.length)throw{status:400,message:"Proxy path is required"};if(!e.startsWith("/"))throw{status:400,message:'Proxy path must start with "/"'};if(e.includes("://")||e.includes(".."))throw{status:400,message:"Proxy path contains invalid segments"};if(e.includes("?"))throw{status:400,message:"Proxy path must not contain query string; use payload.query"};return e}buildProxyQueryString(e){if(null==e)return"";if("object"!=typeof e||Array.isArray(e))throw{status:400,message:"Proxy query must be an object"};const a=new URLSearchParams;for(const[n,t]of Object.entries(e))if(null!=t)if(Array.isArray(t))for(const e of t){if("string"!=typeof e&&"number"!=typeof e&&"boolean"!=typeof e)throw{status:400,message:`Proxy query value for "${n}" is invalid`};a.append(n,String(e))}else{if("string"!=typeof t&&"number"!=typeof t&&"boolean"!=typeof t)throw{status:400,message:`Proxy query value for "${n}" is invalid`};a.append(n,String(t))}return a.toString()}isProxyAllowed(e,a){return PROXY_ALLOWLIST.some(n=>n.method===e&&n.pattern.test(a))}async requestGitlabApi(e){const a=this.parseProxyMethod(e.method),n=this.parseProxyPath(e.path),t=this.buildProxyQueryString(e.query),s=t.length>0?`${n}?${t}`:n;if(!this.isProxyAllowed(a,n))throw{status:403,message:`Proxy path not allowed: ${a} ${n}`};return"GET"===a?await this.request(s,a):await this.request(s,a,e.body)}}function summarizePayloadKeys(e){const a=Object.keys(e||{});return a.length>0?a.join(","):"-"}function truncateValue(e,a=300){return e.length<=a?e:`${e.slice(0,a)}...`}function summarizeGitlabResult(e,a){if(Array.isArray(a))return`items=${a.length}`;if(a&&"object"==typeof a){const n=a;return"resolveGitAuthContext"===e?`authMode=${String(n.authMode??"unknown")}, hasPat=${Boolean(n.hasPat)}`:"number"in n||"state"in n?`number=${String(n.number??"-")}, state=${String(n.state??"-")}`:`keys=${Object.keys(n).join(",")||"-"}`}return"type="+typeof a}function resolveApiHost(e){try{return new URL(e).host}catch{return"invalid-url"}}function createTaskHandler(e){return async(a,n)=>{_package.logger.info(`[EVENT HANDLER] create-task: ${a.taskId}, agentType=${a.agentType}, agentId=${a.agentId}`),"task-message"===a.event?await e.workerManager.startWorker(a,"create-task"):_package.logger.error(`[EVENT HANDLER] create-task expects task-message, got ${a.event} for task ${a.taskId}`)}}function resumeTaskHandler(e){return async(a,n)=>{_package.logger.debug(`[EVENT HANDLER] resume-task: ${a.taskId}, agentSessionId=${a.agentSessionId}`),await e.workerManager.startWorker(a,"resume-task")}}function shutdownMachineHandler(e){return async a=>{_package.logger.info("[EVENT HANDLER] shutdown-machine received",a),e.requestShutdown("agentrix-app",a.reason)}}function deployAgentHandler(e){return async(a,n)=>{_package.logger.info(`[EVENT HANDLER] deploy-agent received: taskId=${a.taskId}, draftAgentId=${a.draftAgentId}, targetAgentId=${a.targetAgentId}, sourcePath=${a.sourcePath}`),await e.workerManager.startDeploymentWorker(a)}}function daemonGitlabRequestHandler(e){return async a=>{_package.logger.info(`[GITLAB PROXY] request received: reqId=${a.requestId}, op=${a.operation}, gitServer=${a.gitServerId}, ttlMs=${a.ttlMs}, payloadKeys=${summarizePayloadKeys(a.payload)}`);const n=Date.now(),t=n=>{const t={eventId:a.requestId,requestId:a.requestId,machineId:e.machineId,...n};e.client?(e.client.send("daemon-gitlab-response",t),_package.logger.info(`[GITLAB PROXY] response sent: reqId=${a.requestId}, op=${a.operation}, success=${n.success}, executionMs=${n.executionTimeMs}`)):_package.logger.error(`[GITLAB PROXY] response dropped: reqId=${a.requestId}, op=${a.operation}, reason=socket-client-unavailable`)};try{const e=await _package.machine.getSecretKey();if(!e)return _package.logger.warn(`[GITLAB PROXY] machine secret key unavailable: reqId=${a.requestId}, op=${a.operation}, gitServer=${a.gitServerId}`),void t({success:!1,errorCode:"PAT_MISSING",errorMessage:"Machine secret key not available",executionTimeMs:Date.now()-n});const s=loadPat(a.gitServerId,e);if(!s)return _package.logger.warn(`[GITLAB PROXY] PAT missing: reqId=${a.requestId}, op=${a.operation}, gitServer=${a.gitServerId}`),void t({success:!1,errorCode:"PAT_MISSING",errorMessage:`No PAT configured for git server ${a.gitServerId}`,executionTimeMs:Date.now()-n});const i=a.payload.apiUrl;if(!i)return _package.logger.warn(`[GITLAB PROXY] apiUrl missing in payload: reqId=${a.requestId}, op=${a.operation}, gitServer=${a.gitServerId}`),void t({success:!1,errorCode:"PAT_MISSING",errorMessage:"GitLab API URL not provided in request",executionTimeMs:Date.now()-n});_package.logger.info(`[GITLAB PROXY] executing: reqId=${a.requestId}, op=${a.operation}, gitServer=${a.gitServerId}, apiHost=${resolveApiHost(i)}`);const o=new GitLabExecutor(i,s,{requestId:a.requestId,gitServerId:a.gitServerId}),r=await o.executeOperation(a.operation,a.payload);_package.logger.info(`[GITLAB PROXY] execution succeeded: reqId=${a.requestId}, op=${a.operation}, summary=${summarizeGitlabResult(a.operation,r)}`),t({success:!0,data:r,executionTimeMs:Date.now()-n})}catch(e){const s=e;let i="GITLAB_CONNECTIVITY_FAILED";401===s.status?i="PAT_INVALID":403===s.status?i="PAT_SCOPE_INSUFFICIENT":404===s.status&&(i="RESOURCE_NOT_FOUND");const o="string"==typeof s.message?s.message:"Unknown error",r="string"==typeof s.detail?truncateValue(s.detail):void 0,c="number"==typeof s.status?String(s.status):"unknown";_package.logger.error(`[GITLAB PROXY] execution failed: reqId=${a.requestId}, op=${a.operation}, errorCode=${i}, status=${c}, message=${o}${r?`, detail=${r}`:""}`),t({success:!1,errorCode:i,errorMessage:o,executionTimeMs:Date.now()-n})}}}function createEventHandlers(e){return{"create-task":createTaskHandler(e),"resume-task":resumeTaskHandler(e),"deploy-agent":deployAgentHandler(e),"shutdown-machine":shutdownMachineHandler(e),"workspace-file-request":workspaceFileRequestHandler({client:e.client}),"daemon-gitlab-request":daemonGitlabRequestHandler(e)}}const CHUNK_SIZE=65536,DEFAULT_MAX_FILE_SIZE_MB=parseInt(process.env.MAX_WORKSPACE_FILE_SIZE_MB||"100",10);function getPeerConnectionConstructor(e){return e.RTCPeerConnection||e.PeerConnection||e.RTCConnection||e.PeerConnection}function normalizeIceServers(e){const a=[];return e.forEach(e=>{Array.isArray(e.urls)?a.push(...e.urls):a.push(e.urls)}),a}function sendChannelMessage(e,a){if(!e)return;if("string"==typeof a)return void(e.sendMessage?e.sendMessage(a):e.send&&e.send(a));const n=Buffer.from(a);e.sendMessageBinary?e.sendMessageBinary(n):e.send&&e.send(n)}function normalizeSignalDescription(e,a){return e&&"object"==typeof e&&"string"==typeof e.sdp?{sdp:e.sdp,type:e.type||a}:{sdp:String(e||""),type:a}}function normalizeCandidate(e,a,n){return"string"==typeof e?{candidate:e,sdpMid:a||"0",sdpMLineIndex:n??0}:e&&"string"==typeof e.candidate?{candidate:e.candidate,sdpMid:e.sdpMid||e.mid||a||"0",sdpMLineIndex:"number"==typeof e.sdpMLineIndex?e.sdpMLineIndex:n??0}:null}function resolveFilePath(e,a,n){return _package.machine.resolveWorkspaceFilePath(e,a,n)}function isFileModified(e,a){return!a||e.mtime.toISOString()!==a}class MachineRtcManager{client;machineId;iceServers=[];sessions=new Map;rtcModule;peerConstructor;constructor(e,a){this.client=e,this.machineId=a;const n=node_module.createRequire("undefined"==typeof document?require("url").pathToFileURL(__filename).href:_documentCurrentScript&&"SCRIPT"===_documentCurrentScript.tagName.toUpperCase()&&_documentCurrentScript.src||new URL("index.cjs",document.baseURI).href);this.rtcModule=n("node-datachannel"),this.peerConstructor=getPeerConnectionConstructor(this.rtcModule),this.rtcModule.setDebugLevel?.("warning")}registerHandlers(){this.peerConstructor?(this.client.onLifecycle("connect",()=>{this.requestIceServers()}),this.client.onEvent("rtc-ice-servers-response",e=>this.handleIceServersResponse(e)),this.client.onEvent("machine-rtc-request",e=>this.handleRtcRequest(e)),this.client.onEvent("rtc-signal",e=>this.handleRtcSignal(e))):_package.logger.warn("[RTC] node-datachannel RTCPeerConnection not available")}shutdown(){this.sessions.forEach(e=>{e.peerConnection.close?.()}),this.sessions.clear()}requestIceServers(){this.client.send("rtc-ice-servers-request",{eventId:shared.createEventId()})}handleIceServersResponse(e){this.iceServers=normalizeIceServers(e.iceServers),_package.logger.info(`[RTC] Loaded ${this.iceServers.length} ICE servers`)}handleRtcRequest(e){if(!this.peerConstructor)return;const a=e.userId;if(!a)return void _package.logger.warn("[RTC] machine-rtc-request missing userId");const n=e.workspaceUserId||a,t=e.taskId;if(this.sessions.has(e.sessionId))return void this.sendMachineRtcResponse(e.sessionId,a,!0);const s=new this.peerConstructor(e.sessionId,{iceServers:this.iceServers}),i={sessionId:e.sessionId,userId:a,workspaceUserId:n,allowedTaskId:t||void 0,peerConnection:s,lastActivity:Date.now(),remoteDescriptionSet:!1,pendingCandidates:[]};this.sessions.set(e.sessionId,i),this.registerPeerHandlers(i),this.sendMachineRtcResponse(e.sessionId,a,!0)}sendMachineRtcResponse(e,a,n,t){this.client.send("machine-rtc-response",{eventId:shared.createEventId(),machineId:this.machineId,sessionId:e,accepted:n,reason:t,userId:a,capabilities:{dataChannel:!0}})}handleRtcSignal(e){if(!this.peerConstructor)return;if("app"!==e.from)return;const a=e.userId;if(!a)return void _package.logger.warn("[RTC] rtc-signal missing userId");const n=e.workspaceUserId||a,t=e.taskId;let s=this.sessions.get(e.sessionId);if(!s){const i=new this.peerConstructor(e.sessionId,{iceServers:this.iceServers});s={sessionId:e.sessionId,userId:a,workspaceUserId:n,allowedTaskId:t||void 0,peerConnection:i,lastActivity:Date.now(),remoteDescriptionSet:!1,pendingCandidates:[]},this.sessions.set(e.sessionId,s),this.registerPeerHandlers(s)}try{this.applyRemoteSignal(s,e.signal)}catch(e){_package.logger.warn("[RTC] Failed to apply remote signal",e)}}registerPeerHandlers(e){const{peerConnection:a}=e;a.onStateChange?.(a=>{_package.logger.info(`[RTC] Peer state (${e.sessionId}): ${a}`)}),a.onGatheringStateChange?.(a=>{_package.logger.info(`[RTC] ICE gathering (${e.sessionId}): ${a}`)}),a.onLocalDescription?.((a,n)=>{const t=normalizeSignalDescription(a,n);this.client.send("rtc-signal",{eventId:shared.createEventId(),machineId:this.machineId,sessionId:e.sessionId,from:"machine",signal:t,userId:e.userId})}),a.onLocalCandidate?.((a,n,t)=>{const s=normalizeCandidate(a,n,t);s&&this.client.send("rtc-signal",{eventId:shared.createEventId(),machineId:this.machineId,sessionId:e.sessionId,from:"machine",signal:{candidate:s},userId:e.userId})}),a.onDataChannel?.(a=>{e.dataChannel=a,this.registerDataChannel(e,a)})}registerDataChannel(e,a){a.onOpen?.(()=>{_package.logger.info(`[RTC] Data channel open (${e.sessionId})`),e.lastActivity=Date.now(),sendChannelMessage(a,JSON.stringify({v:1,type:"control.ready",channel:"control",requestId:`req-${e.sessionId}`,streamId:0,timestamp:(new Date).toISOString(),payload:{ok:!0}}))}),a.onClosed?.(()=>{_package.logger.warn(`[RTC] Data channel closed (${e.sessionId})`),e.peerConnection.close?.(),this.sessions.delete(e.sessionId)}),a.onError?.(a=>{_package.logger.error(`[RTC] Data channel error (${e.sessionId})`,a)}),a.onMessage?.(a=>{e.lastActivity=Date.now(),this.handleDataChannelMessage(e,a)})}handleDataChannelMessage(e,a){if(Buffer.isBuffer(a)||a instanceof Uint8Array){try{shared.splitRtcChunkFrame(new Uint8Array(a))}catch(e){_package.logger.warn("[RTC] Received binary payload without handler")}return}let n=null;if("string"==typeof a?n=a:a&&"string"==typeof a.text&&(n=a.text),!n)return;let t=null;try{t=JSON.parse(n)}catch(e){return void _package.logger.warn("[RTC] Non-JSON message",n)}t&&"string"==typeof t.type&&"file.request"===t.type&&this.handleFileRequest(e,t).catch(e=>{_package.logger.error("[RTC] Failed to handle file request",e)})}async handleFileRequest(e,a){const n=a.payload;if(!n)return;if(n.userId!==e.workspaceUserId)return void this.sendControl(e,{v:1,type:"file.error",channel:"file",requestId:a.requestId,streamId:a.streamId,timestamp:(new Date).toISOString(),error:{code:"unauthorized",message:"Unauthorized workspace access"}});if(e.allowedTaskId&&n.taskId!==e.allowedTaskId)return void this.sendControl(e,{v:1,type:"file.error",channel:"file",requestId:a.requestId,streamId:a.streamId,timestamp:(new Date).toISOString(),error:{code:"unauthorized",message:"Unauthorized task access"}});const t=resolveFilePath(n.userId,n.taskId,n.relativePath);if(!fs__namespace.existsSync(t))return void this.sendControl(e,{v:1,type:"file.error",channel:"file",requestId:a.requestId,streamId:a.streamId,timestamp:(new Date).toISOString(),error:{code:"file_not_found",message:"File or directory not found"}});const s=await fs__namespace.promises.stat(t);if(!isFileModified(s,n.ifModifiedSince))return void this.sendControl(e,{v:1,type:"file.not_modified",channel:"file",requestId:a.requestId,streamId:a.streamId,timestamp:(new Date).toISOString()});if(s.isDirectory()||"directory"===n.entryType){const n=await fs__namespace.promises.readdir(t,{withFileTypes:!0}),i={entries:await Promise.all(n.map(async e=>{const a=path__namespace.join(t,e.name),n=await fs__namespace.promises.stat(a);return{name:e.name,type:e.isDirectory()?"directory":"file",size:n.size,modifiedAt:n.mtime.toISOString()}})),modifiedAt:s.mtime.toISOString()};return void this.sendControl(e,{v:1,type:"file.dir",channel:"file",requestId:a.requestId,streamId:a.streamId,timestamp:(new Date).toISOString(),payload:i})}const i=1024*(n.maxFileSizeMB??DEFAULT_MAX_FILE_SIZE_MB)*1024;if(s.size>i)return void this.sendControl(e,{v:1,type:"file.error",channel:"file",requestId:a.requestId,streamId:a.streamId,timestamp:(new Date).toISOString(),error:{code:"file_too_large",message:"File exceeds size limit"}});const o=mimeTypesExports.lookup(t)||"application/octet-stream",r={size:s.size,mimeType:"string"==typeof o?o:"application/octet-stream",modifiedAt:s.mtime.toISOString()};this.sendControl(e,{v:1,type:"file.meta",channel:"file",requestId:a.requestId,streamId:a.streamId,timestamp:(new Date).toISOString(),payload:r}),await this.sendFileChunks(e,a.streamId,t),this.sendControl(e,{v:1,type:"file.end",channel:"file",requestId:a.requestId,streamId:a.streamId,timestamp:(new Date).toISOString(),payload:{size:s.size}})}async sendFileChunks(e,a,n){const t=e.dataChannel;if(!t)return;const s=fs__namespace.createReadStream(n,{highWaterMark:65536});let i=0;await new Promise((e,n)=>{s.on("data",e=>{const n=shared.RtcChunkFlags.Binary|(0===i?shared.RtcChunkFlags.Start:0),s=Buffer.isBuffer(e)?e:Buffer.from(e),o=new Uint8Array(s.buffer,s.byteOffset,s.byteLength),r=shared.buildRtcChunkFrame({streamId:a,seq:i,flags:n,payloadLength:o.length},o);sendChannelMessage(t,r),i+=1}),s.on("end",()=>{if(i>0){const e=shared.buildRtcChunkFrame({streamId:a,seq:i,flags:shared.RtcChunkFlags.End|shared.RtcChunkFlags.Binary,payloadLength:0},new Uint8Array);sendChannelMessage(t,e)}e()}),s.on("error",e=>n(e))})}sendControl(e,a){const n=e.dataChannel;n&&sendChannelMessage(n,JSON.stringify(a))}applyRemoteSignal(e,a){const{peerConnection:n}=e;if(a&&a.sdp&&a.type)return n.setRemoteDescription?.(a.sdp,a.type),e.remoteDescriptionSet=!0,e.pendingCandidates?.forEach(e=>{try{n.addRemoteCandidate?.(e.candidate,e.mid)}catch(e){_package.logger.warn("[RTC] Failed to add queued candidate",e)}}),void(e.pendingCandidates=[]);if(a&&a.candidate){const t=a.candidate,s="string"==typeof t?t:t&&"string"==typeof t.candidate?t.candidate:null,i=a.sdpMid||t?.sdpMid||t?.mid||"0";if(s){if(!e.remoteDescriptionSet)return void e.pendingCandidates?.push({candidate:s,mid:i});n.addRemoteCandidate?.(s,i)}}}}class MachineClient{client;context;rtcManager;constructor(e,a,n){const{machineId:t,...s}=e;this.client=new SocketClient(s),this.context={machineId:t,workerManager:a,requestShutdown:n.requestShutdown,client:this.client},this.rtcManager=new MachineRtcManager(this.client,t),this.initHandlers(),this.rtcManager.registerHandlers()}connect(){return new Promise((e,a)=>{const n=setTimeout(()=>{a(new Error("Machine connection timeout after 30 seconds"))},3e4);this.client.onLifecycle("connect",()=>{clearTimeout(n),e()}),this.client.onLifecycle("connect_error",e=>{clearTimeout(n),a(e)}),this.client.connect()})}async disconnect(){this.client.connected&&await this.client.flush(5e3).catch(()=>{}),this.rtcManager.shutdown(),this.client.disconnect()}initHandlers(){const e=createEventHandlers(this.context);this.client.onEventWithAck("create-task",e["create-task"]),this.client.onEventWithAck("resume-task",e["resume-task"]),this.client.onEventWithAck("deploy-agent",e["deploy-agent"]),this.client.onEvent("shutdown-machine",e["shutdown-machine"]),this.client.onEvent("workspace-file-request",e["workspace-file-request"]),this.client.onEvent("daemon-gitlab-request",e["daemon-gitlab-request"])}}let caffeinateProcess=null;function startCaffeinate(){if(_package.machine.disableCaffeinate)return _package.logger.debug("[caffeinate] Caffeinate disabled via AGENTRIX_DISABLE_CAFFEINATE environment variable"),!1;if("darwin"!==process.platform)return _package.logger.debug("[caffeinate] Not on macOS, skipping caffeinate"),!1;if(caffeinateProcess&&!caffeinateProcess.killed)return _package.logger.debug("[caffeinate] Caffeinate already running"),!0;try{return caffeinateProcess=child_process.spawn("caffeinate",["-im"],{stdio:"ignore",detached:!1}),caffeinateProcess.on("error",e=>{_package.logger.debug("[caffeinate] Error starting caffeinate:",e),caffeinateProcess=null}),caffeinateProcess.on("exit",(e,a)=>{_package.logger.debug(`[caffeinate] Process exited with code ${e}, signal ${a}`),caffeinateProcess=null}),_package.logger.info(`[caffeinate] Started with PID ${caffeinateProcess.pid}`),setupCleanupHandlers(),!0}catch(e){return _package.logger.info("[caffeinate] Failed to start caffeinate:",e),!1}}let isStopping=!1;async function stopCaffeinate(){if(isStopping)_package.logger.info("[caffeinate] Already stopping, skipping");else if(caffeinateProcess&&!caffeinateProcess.killed){isStopping=!0,_package.logger.info(`[caffeinate] Stopping caffeinate process PID ${caffeinateProcess.pid}`);try{caffeinateProcess.kill("SIGTERM"),await new Promise(e=>setTimeout(e,1e3)),caffeinateProcess&&!caffeinateProcess.killed&&caffeinateProcess.kill("SIGKILL"),caffeinateProcess=null,isStopping=!1}catch(e){_package.logger.info("[caffeinate] Error stopping caffeinate:",e),isStopping=!1}}}let cleanupHandlersSet=!1;function setupCleanupHandlers(){if(cleanupHandlersSet)return;cleanupHandlersSet=!0;const e=()=>{stopCaffeinate()};process.on("exit",e),process.on("SIGINT",e),process.on("SIGTERM",e),process.on("SIGUSR1",e),process.on("SIGUSR2",e),process.on("uncaughtException",a=>{_package.logger.debug("[caffeinate] Uncaught exception, cleaning up:",a),e()}),process.on("unhandledRejection",(a,n)=>{_package.logger.debug("[caffeinate] Unhandled rejection, cleaning up:",a),e()})}async function findAllAgentrixProcesses(){try{const e=await psList(),a=[];for(const n of e){const e=n.cmd||"",t=n.name||"";if(!(t.includes("agentrix")||"node"===t&&(e.includes("agentrix-cli")||e.includes("dist/index.mjs"))||("MainThread"===t||t.includes("MainThread"))&&(e.includes("agentrix-cli")||e.includes("dist/index.mjs")||e.includes("agentrix.mjs"))||e.includes("agentrix.mjs")||e.includes("agentrix-cli")||e.includes("tsx")&&e.includes("src/index.ts")&&e.includes("agentrix-cli")))continue;if(n.pid===process.pid||n.pid===process.ppid)continue;let s="unknown";e.includes(" worker")?s="worker":e.includes(" upgrade-daemon")?s="upgrade-daemon":e.includes(" daemon")?s="daemon":e.includes("doctor")&&(s="doctor"),a.push({pid:n.pid,command:e||t,type:s})}return a}catch(e){return[]}}async function findRunawayAgentrixProcesses(){return(await findAllAgentrixProcesses()).filter(e=>e.pid!==process.pid&&("daemon"===e.type||"worker"===e.type||"upgrade-daemon"===e.type)).map(e=>({pid:e.pid,command:e.command}))}async function killRunawayAgentrixProcesses(){const e=await findRunawayAgentrixProcesses(),a=[];let n=0;for(const{pid:t,command:s}of e)try{if(console.log(`Killing runaway process PID ${t}: ${s}`),"win32"===process.platform){const e=spawn.sync("taskkill",["/F","/PID",t.toString()],{stdio:"pipe"});if(e.error)throw e.error;if(0!==e.status)throw new Error(`taskkill exited with code ${e.status}`)}else{process.kill(t,"SIGTERM"),await new Promise(e=>setTimeout(e,1e3));(await psList()).find(e=>e.pid===t)&&(console.log(`Process PID ${t} ignored SIGTERM, using SIGKILL`),process.kill(t,"SIGKILL"))}console.log(`Successfully killed runaway process PID ${t}`),n++}catch(e){const n=e.message;a.push({pid:t,error:n}),console.log(`Failed to kill process PID ${t}: ${n}`)}return{killed:n,errors:a}}function isCommandAvailable$1(e){try{return{available:!0,path:child_process.execSync(`which ${e}`,{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).trim()}}catch{return{available:!1}}}function getSandboxDependencies(e){if("macos"===e){const e=isCommandAvailable$1("rg");return[{name:"ripgrep",installed:e.available,required:!0,description:"Fast code search tool (required by sandbox)",installCommand:"brew install ripgrep",path:e.path}]}if("linux"===e){const e=isCommandAvailable$1("bwrap"),a=isCommandAvailable$1("socat");return[{name:"bubblewrap",installed:e.available,required:!0,description:"Sandboxing tool for Linux",installCommand:"sudo apt install bubblewrap # Debian/Ubuntu\nsudo yum install bubblewrap # RHEL/CentOS\nsudo pacman -S bubblewrap # Arch",path:e.path},{name:"socat",installed:a.available,required:!0,description:"Socket communication tool (required by sandbox)",installCommand:"sudo apt install socat # Debian/Ubuntu\nsudo yum install socat # RHEL/CentOS\nsudo pacman -S socat # Arch",path:a.path}]}return[]}function getCliDependencies(){const e=isCommandAvailable$1("git"),a=isCommandAvailable$1("claude"),n=isCommandAvailable$1("codex");return[{name:"git",installed:e.available,required:!0,description:"Version control system (required for all tasks)",installCommand:"https://git-scm.com/downloads",path:e.path},{name:"claude",installed:a.available,required:!0,description:"Claude Code CLI (required for most features)",installCommand:"npm install -g @anthropic-ai/claude-code",path:a.path},{name:"codex",installed:n.available,required:!1,description:"Codex CLI (optional, for Codex tasks)",installCommand:"npm install -g @codex-ai/codex-cli",path:n.path}]}function checkAllDependencies(){const e=platform_js.getPlatform(),a=getCliDependencies(),n=getSandboxDependencies(e),t=a.filter(e=>e.required&&!e.installed),s=n.filter(e=>e.required&&!e.installed);return{cli:a,sandbox:n,allSatisfied:0===t.length&&0===s.length,missingSandbox:s,missingCli:t}}function displayDependencyStatus(e=!1){const a=checkAllDependencies(),n=platform_js.getPlatform();console.log(chalk.bold("\n🔧 CLI Dependencies"));for(const n of a.cli)if(n.installed)console.log(chalk.green(`✓ ${n.name}`),chalk.gray(`- ${n.description}`)),e&&n.path&&console.log(chalk.gray(` Location: ${n.path}`));else{const e=n.required?chalk.red("❌"):chalk.yellow("⚠️");console.log(`${e} ${n.name}`,chalk.gray(`- ${n.description}`)),n.installCommand&&console.log(chalk.blue(` Install: ${n.installCommand}`))}if(a.sandbox.length>0){console.log(chalk.bold("\n🔒 Sandbox Dependencies")),console.log(chalk.gray(`Platform: ${n}`));for(const n of a.sandbox)n.installed?(console.log(chalk.green(`✓ ${n.name}`),chalk.gray(`- ${n.description}`)),e&&n.path&&console.log(chalk.gray(` Location: ${n.path}`))):(console.log(chalk.red(`❌ ${n.name}`),chalk.gray(`- ${n.description}`)),n.installCommand&&console.log(chalk.blue(` Install: ${n.installCommand}`)))}else console.log(chalk.bold("\n🔒 Sandbox Dependencies")),console.log(chalk.yellow(`⚠️ Platform ${n} not supported - sandbox will be disabled`));if(a.allSatisfied)return console.log(chalk.bold.green("\n✓ All required dependencies are installed")),!0;{console.log(chalk.bold.red("\n⚠️ Missing Required Dependencies"));const e=[...a.missingCli,...a.missingSandbox];for(const a of e)console.log(chalk.red(` • ${a.name}`));return console.log(chalk.yellow("\nPlease install missing dependencies before starting the daemon.")),!1}}function checkCriticalDependencies(){const e=checkAllDependencies(),a=[],n=e.cli.find(e=>"git"===e.name);n&&!n.installed&&a.push("git");for(const n of e.missingSandbox)a.push(n.name);return{ok:0===a.length,missing:a}}function getEnvironmentInfo(){return{PWD:process.env.PWD,AGENTRIX_HOME_DIR:process.env.AGENTRIX_HOME_DIR,AGENTRIX_SERVER_URL:process.env.AGENTRIX_SERVER_URL,AGENTRIX_PROJECT_ROOT:process.env.AGENTRIX_PROJECT_ROOT,DANGEROUSLY_LOG_TO_SERVER_FOR_AI_AUTO_DEBUGGING:process.env.DANGEROUSLY_LOG_TO_SERVER_FOR_AI_AUTO_DEBUGGING,NODE_ENV:process.env.NODE_ENV,DEBUG:process.env.DEBUG,workingDirectory:process.cwd(),processArgv:process.argv,agentrixDir:_package.machine.agentrixHomeDir,serverUrl:_package.machine.serverUrl,logsDir:_package.machine.getStatePaths().logsDir,processPid:process.pid,nodeVersion:process.version,platform:process.platform,arch:process.arch,user:process.env.USER,home:process.env.HOME,shell:process.env.SHELL,terminal:process.env.TERM}}async function runDoctorCommand(e){if(e||(e="all"),console.log(chalk.bold.cyan("\n🩺 Agentrix CLI Doctor\n")),"all"===e){console.log(chalk.bold("📋 Basic Information")),console.log(`Agentrix CLI Version: ${chalk.green(_package.packageJson.version)}`),console.log(`Platform: ${chalk.green(process.platform)} ${process.arch}`),console.log(`Node.js Version: ${chalk.green(process.version)}`),console.log(""),console.log(chalk.bold("🔧 Daemon Spawn Diagnostics"));const e=_package.projectPath(),a=path$1.join(e,"bin","agentrix.mjs"),n=path$1.join(e,"dist","index.mjs");console.log(`Project Root: ${chalk.blue(e)}`),console.log(`Wrapper Script: ${chalk.blue(a)}`),console.log(`CLI Entrypoint: ${chalk.blue(n)}`),console.log(`Wrapper Exists: ${fs$1.existsSync(a)?chalk.green("✓ Yes"):chalk.red("❌ No")}`),console.log(`CLI Exists: ${fs$1.existsSync(n)?chalk.green("✓ Yes"):chalk.red("❌ No")}`),console.log(""),console.log(chalk.bold("⚙️ Configuration")),console.log(`Agentrix Home: ${chalk.blue(_package.machine.agentrixHomeDir)}`),console.log(`Server URL: ${chalk.blue(_package.machine.serverUrl)}`),console.log(`Logs Dir: ${chalk.blue(_package.machine.getStatePaths().logsDir)}`),console.log(chalk.bold("\n🌍 Environment Variables"));const t=getEnvironmentInfo();console.log(`AGENTRIX_HOME_DIR: ${t.AGENTRIX_HOME_DIR?chalk.green(t.AGENTRIX_HOME_DIR):chalk.gray("not set")}`),console.log(`AGENTRIX_SERVER_URL: ${t.AGENTRIX_SERVER_URL?chalk.green(t.AGENTRIX_SERVER_URL):chalk.gray("not set")}`),console.log(`DANGEROUSLY_LOG_TO_SERVER: ${t.DANGEROUSLY_LOG_TO_SERVER_FOR_AI_AUTO_DEBUGGING?chalk.yellow("ENABLED"):chalk.gray("not set")}`),console.log(`DEBUG: ${t.DEBUG?chalk.green(t.DEBUG):chalk.gray("not set")}`),console.log(`NODE_ENV: ${t.NODE_ENV?chalk.green(t.NODE_ENV):chalk.gray("not set")}`),console.log(chalk.bold("\n🔐 Authentication"));try{await _package.machine.readCredentials()?console.log(chalk.green("✓ Authenticated (credentials found)")):console.log(chalk.yellow("⚠️ Not authenticated (no credentials)"))}catch(e){console.log(chalk.red("❌ Error reading credentials"))}displayDependencyStatus(!0)}console.log(chalk.bold("\n🤖 Daemon Status"));try{const a=await checkIfDaemonRunningAndCleanupStaleState(),n=await _package.machine.readDaemonState();if(a&&n?(console.log(chalk.green("✓ Daemon is running")),console.log(` PID: ${n.pid}`),console.log(` Started: ${new Date(n.startTime).toLocaleString()}`),console.log(` CLI Version: ${n.cliVersion}`),n.port&&console.log(` HTTP Port: ${n.port}`)):n&&!a?console.log(chalk.yellow("⚠️ Daemon state exists but process not running (stale)")):console.log(chalk.red("❌ Daemon is not running")),n){console.log(chalk.bold("\n📄 Daemon State:"));const e=_package.machine.getStatePaths();console.log(chalk.blue(`Location: ${e.daemonStateFile}`)),console.log(chalk.gray(JSON.stringify(n,null,2)))}const t=await findAllAgentrixProcesses();if(t.length>0){console.log(chalk.bold("\n🔍 All Agentrix CLI Processes"));const e=t.reduce((e,a)=>(e[a.type]||(e[a.type]=[]),e[a.type].push(a),e),{});Object.entries(e).forEach(([e,a])=>{console.log(chalk.blue(`\n${{daemon:"🤖 Daemon","upgrade-daemon":"🔄 Upgrade Daemon",worker:"🔗 Workers",doctor:"🩺 Doctor",unknown:"❓ Unknown"}[e]||e}:`)),a.forEach(({pid:a,command:n})=>{const t=e.startsWith("dev")?chalk.cyan:e.includes("daemon")?chalk.blue:chalk.gray;console.log(` ${t(`PID ${a}`)}: ${chalk.gray(n)}`)})})}else console.log(chalk.red("❌ No agentrix processes found"));"all"===e&&t.length>1&&(console.log(chalk.bold("\n💡 Process Management")),console.log(chalk.gray("To clean up runaway processes: agentrix killall")))}catch(e){console.log(chalk.red("❌ Error checking daemon status"))}}const CACHE_TTL_MS=6048e5;let cachedOpeners=null;async function listOpeners(){const e=getOpenerOverrides(),a=getOpenerOverridesSignature(e);if(cachedOpeners&&cachedOpeners.expiresAt>Date.now()&&cachedOpeners.overridesSignature===a)return cachedOpeners.openers;const n=getOpenerDefinitions(e),t=[];for(const e of n){const a=e.isSupported();a&&t.push({id:e.id,label:e.label,kind:e.kind,method:e.method,urlTemplate:e.urlTemplate,supported:a})}return cachedOpeners={expiresAt:Date.now()+6048e5,openers:t,overridesSignature:a},t}async function openWithOpener({openerId:e,targetPath:a,userId:n,taskId:t}){const s=getOpenerDefinitions(getOpenerOverrides()).find(a=>a.id===e);if(!s)return{success:!1,error:"Unknown openerId"};if("cli"!==s.method||!s.open)return{success:!1,error:"Opener is not executable by CLI"};if(!s.isSupported())return{success:!1,error:"Opener is not supported on this system"};let i;try{i=resolveTargetPath(a,n,t)}catch(e){return{success:!1,error:e instanceof Error?e.message:"Invalid path"}}try{return s.open(i),{success:!0}}catch(e){const a=e instanceof Error?e.message:"Failed to open path";return _package.logger.warn(`[OPENERS] Failed to open path: ${a}`),{success:!1,error:a}}}function pickDirectory(e){const a=process.platform;if("darwin"===a)return pickDirectoryMac(e);if("win32"===a)return pickDirectoryWindows(e);if("linux"===a)return pickDirectoryLinux(e);throw new Error("Directory picker is not supported on this platform")}function resolveTargetPath(e,a,n){const t=path$1.resolve(e);if(!path$1.isAbsolute(t))throw new Error("Path must be absolute");if(!fs$1.statSync(t).isDirectory())throw new Error("Path must be a directory");if(a&&n){const e=_package.machine.getTaskCwd(a,n);if(e&&!isSubPath(t,path$1.resolve(e)))throw new Error("Path is outside the task workspace")}return t}function isSubPath(e,a){const n=path$1.relative(a,e);return""===n||!n.startsWith("..")&&!path$1.isAbsolute(n)}function getOpenerDefinitions(e){const a=process.platform,n=["Visual Studio Code","Visual Studio Code - Insiders"],t=["Cursor"],s=["IntelliJ IDEA","IntelliJ IDEA CE","IntelliJ IDEA Ultimate"],i=["WebStorm"],o=["PyCharm","PyCharm CE","PyCharm Professional"];return applyOpenerOverrides([{id:"vscode",label:"VS Code",kind:"editor",method:"scheme",urlTemplate:"vscode://file/{path}?windowId=_blank",scheme:"vscode",macAppNames:n,isSupported:()=>isSchemeRegistered("vscode",a,n)},{id:"cursor",label:"Cursor",kind:"editor",method:"scheme",urlTemplate:"cursor://file/{path}?windowId=_blank",scheme:"cursor",macAppNames:t,isSupported:()=>isSchemeRegistered("cursor",a,t)},{id:"idea",label:"IntelliJ IDEA",kind:"ide",method:"scheme",urlTemplate:"idea://open?file={path}&newWindow=true",scheme:"idea",macAppNames:s,isSupported:()=>isSchemeRegistered("idea",a,s)},{id:"pycharm",label:"PyCharm",kind:"ide",method:"scheme",urlTemplate:"pycharm://open?file={path}&newWindow=true",scheme:"pycharm",macAppNames:o,isSupported:()=>isSchemeRegistered("pycharm",a,o)},{id:"webstorm",label:"WebStorm",kind:"ide",method:"scheme",urlTemplate:"webstorm://open?file={path}&newWindow=true",scheme:"webstorm",macAppNames:i,isSupported:()=>isSchemeRegistered("webstorm",a,i)},{id:"file-manager",label:"darwin"===a?"Finder":"win32"===a?"Explorer":"Files",kind:"file-manager",method:"cli",isSupported:()=>isFileManagerSupported(a),open:e=>openInFileManager(e,a)},{id:"open-with",label:"Open With...",kind:"system",method:"cli",isSupported:()=>isOpenWithSupported(a),open:e=>openWithChooser(e,a)}],a,e)}function pickDirectoryMac(e){const a=resolvePickerDefaultPath(e),n=[];if(a){const e=escapeAppleScriptString(a);n.push("-e",`set defaultLocation to POSIX file "${e}"`,"-e","set chosenFolder to choose folder default location defaultLocation")}else n.push("-e","set chosenFolder to choose folder");return n.push("-e","POSIX path of chosenFolder"),normalizePickerOutput(runCommand("osascript",n,{captureOutput:!0}))}function pickDirectoryWindows(e){const a=commandExists("powershell")?"powershell":commandExists("pwsh")?"pwsh":null;if(!a)throw new Error("PowerShell is required to pick a directory");const n=resolvePickerDefaultPath(e),t=["Add-Type -AssemblyName System.Windows.Forms;","$dialog = New-Object System.Windows.Forms.FolderBrowserDialog;",n?`$dialog.SelectedPath = '${escapePowerShellString(n)}';`:"","$null = $dialog.ShowDialog();","$dialog.SelectedPath;"].filter(Boolean).join(" ");return normalizePickerOutput(runCommand(a,"powershell"===a?["-NoProfile","-STA","-Command",t]:["-NoProfile","-Sta","-Command",t],{captureOutput:!0}))}function pickDirectoryLinux(e){const a=resolvePickerDefaultPath(e);if(commandExists("zenity")){const e=["--file-selection","--directory","--title=Select Folder"];if(a){const n=a.endsWith("/")?a:`${a}/`;e.push(`--filename=${n}`)}return normalizePickerOutput(runCommand("zenity",e,{captureOutput:!0}))}if(commandExists("kdialog")){const e=["--getexistingdirectory"];return a&&e.push(a),normalizePickerOutput(runCommand("kdialog",e,{captureOutput:!0}))}throw new Error("No supported directory picker is available")}function resolvePickerDefaultPath(e){if(!e)return;const a=e.replace(/^~(?=$|[\\/])/,os.homedir());if(fs$1.existsSync(a)){try{if(!fs$1.statSync(a).isDirectory())return}catch{return}return a}}function normalizePickerOutput(e){if(!e)return null;return e.trim()||null}function isOpenWithSupported(e){return"darwin"===e?commandExists("osascript"):"win32"===e?commandExists("powershell")||commandExists("pwsh"):"linux"===e&&commandExists("gio")}function isFileManagerSupported(e){return"darwin"===e?commandExists("open"):"win32"===e||"linux"===e&&(commandExists("xdg-open")||commandExists("gio"))}function openWithChooser(e,a){if("darwin"!==a)if("win32"!==a){if("linux"!==a)throw new Error("Open With is not supported on this platform");runCommand("gio",["open","--ask",e])}else runCommand(commandExists("powershell")?"powershell":"pwsh",["-NoProfile","-Command",`Start-Process -Verb OpenAs -FilePath '${escapePowerShellString(e)}'`]);else if(null===runCommand("osascript",["-e",`set targetPath to POSIX file "${escapeAppleScriptString(e)}"`,"-e","set appChoice to choose application","-e","tell appChoice to open targetPath"],{captureOutput:!0}))throw new Error("No application selected")}function openInFileManager(e,a){if("darwin"!==a){if("win32"!==a){if("linux"===a)return commandExists("xdg-open")?void runCommand("xdg-open",[e]):void runCommand("gio",["open",e]);throw new Error("File manager open is not supported on this platform")}runCommand("explorer",[e])}else runCommand("open",[e])}function applyOpenerOverrides(e,a,n){const t=n??getOpenerOverrides();return e.map(e=>{const n=t[e.id];if(!n)return e;if(!1===n.enabled)return{...e,isSupported:()=>!1};const s={...e,label:n.label??e.label,method:n.method??e.method,urlTemplate:n.urlTemplate??e.urlTemplate};if(n.command){const t=normalizeAppNames(n.appName??e.macAppNames);s.method="cli",s.isSupported=()=>isCommandAvailable(n.command,t,a),s.open=e=>openWithCommand(n.command,n.args,e)}return s})}function getOpenerOverrides(){try{const e=_package.machine.readSettings();if(!e||"object"!=typeof e)return{};const a=e.openersOverrides;return a&&"object"==typeof a?a:{}}catch(e){return _package.logger.warn("[OPENERS] Failed to read opener overrides",e),{}}}function getOpenerOverridesSignature(e){try{return JSON.stringify(e)}catch{return""}}function openWithCommand(e,a,n){if(!runCommand(e,(a&&a.length>0?a:["{path}"]).map(e=>e.split("{path}").join(n))))throw new Error(`Command failed: ${e}`)}function isCommandAvailable(e,a,n){return"darwin"===n&&a.length>0?a.some(e=>isMacAppInstalled(e)):path$1.isAbsolute(e)||e.includes(path$1.sep)?fs$1.existsSync(e):commandExists(e)}function normalizeAppNames(e){return e?Array.isArray(e)?e:[e]:[]}function isSchemeRegistered(e,a,n){return"darwin"===a?isSchemeRegisteredMac(e,n):"win32"===a?isSchemeRegisteredWindows(e):"linux"===a&&isSchemeRegisteredLinux(e)}function isSchemeRegisteredMac(e,a){if(commandExists("mdfind")){const a=runCommand("mdfind",[`kMDItemCFBundleURLSchemes == '${e}'`],{captureOutput:!0});if(a&&a.trim())return!0}if(commandExists("plutil")){const a=[path$1.join(os.homedir(),"Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist"),"/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist"];for(const n of a){if(!fs$1.existsSync(n))continue;const a=runCommand("plutil",["-extract","LSHandlers","json","-o","-",n],{captureOutput:!0});if(a)try{const n=JSON.parse(a);if(Array.isArray(n)&&n.some(a=>a.LSHandlerURLScheme?.toLowerCase()===e.toLowerCase()))return!0}catch(e){_package.logger.debug("[OPENERS] Failed to parse LaunchServices handlers",e)}}}return!!(a&&a.length>0)&&a.some(e=>isMacAppInstalled(e))}function isMacAppInstalled(e){return"darwin"===process.platform&&Boolean(runCommand("open",["-Ra",e]))}function isSchemeRegisteredWindows(e){return commandExists("reg")&&(Boolean(runCommand("reg",["query",`HKCU\\Software\\Classes\\${e}`]))||Boolean(runCommand("reg",["query",`HKCR\\${e}`])))}function isSchemeRegisteredLinux(e){if(commandExists("xdg-settings")){const a=runCommand("xdg-settings",["get","default-url-scheme-handler",e],{captureOutput:!0});if(a&&a.trim()&&"null"!==a.trim())return!0}if(commandExists("gio")){const a=runCommand("gio",["mime",`x-scheme-handler/${e}`],{captureOutput:!0});if(a&&/Default application/.test(a))return!0}return!1}function commandExists(e){return"win32"===process.platform?Boolean(runCommand("where",[e])):Boolean(runCommand("sh",["-c",`command -v ${e}`]))}function runCommand(e,a,n){const t=node_child_process.spawnSync(e,a,{encoding:n?.captureOutput?"utf8":void 0,stdio:n?.captureOutput?"pipe":"ignore",windowsHide:!0});if(0!==t.status){if(n?.captureOutput){const n="string"==typeof t.stderr?t.stderr.trim():"";n&&_package.logger.warn(`[OPENERS] Command failed: ${e} ${a.join(" ")}: ${n}`)}return null}return n?.captureOutput?t.stdout:"ok"}function escapePowerShellString(e){return e.replace(/'/g,"''")}function escapeAppleScriptString(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function writeIfMissing(e,a){fs$1.existsSync(e)||fs$1.writeFileSync(e,a,"utf-8")}function ensureDir(e){fs$1.existsSync(e)||fs$1.mkdirSync(e,{recursive:!0})}const TEMPLATES={"agent.json":JSON.stringify({name:"Companion",version:"1.0.0",description:"Self-evolving personal assistant with persistent memory"},null,2),"claude/config.json":JSON.stringify({systemPrompt:{path:"system_prompt.md",mode:"replace"},settings:{}},null,2),"claude/system_prompt.md":'# Companion\n\nYou are Companion, a self-evolving personal AI assistant.\n\n## Operating Modes\n\nYou operate in two distinct modes. Each session, you run in exactly one of them:\n\n- **Chat mode**: The main companion in a live conversation with the user. Full capabilities, full context, full self-evolution.\n- **Shadow mode**: A background process awakened by a scheduled heartbeat. Reviews recent activity, catches missed follow-ups, and nudges the main companion if needed. Invisible to the user.\n{{#if COMPANION_MODE == shadow}}\n\n**You are currently running in shadow mode.**\n{{/if}}\n{{#if COMPANION_MODE == chat}}\n\n**You are currently running in chat mode.**\n{{/if}}\n\n## Agent Home\n\nYour persistent home directory is `{{COMPANION_HOME}}`.\nThis is your **agent space** — it contains your Claude SDK configuration and self-evolution files.\nThese files **are** your memory.\n\n**This is NOT your working directory.** Your cwd is the task workspace (see below). Agent home is only for identity, memory, and skills.\n{{#if COMPANION_MODE == chat}}\n\n### Session Init\n\nAt the start of each chat session:\n\n1. If `BOOTSTRAP.md` exists — this is the first run, execute the onboarding ritual\n2. Read `SOUL.md` — your personality and behavioral guidelines\n3. Read `IDENTITY.md` — your identity information\n4. Read `USER.md` — knowledge about the user\n5. Read `MEMORY.md` — your long-term memory\n6. Read recent files (last 2 days) from `memory/` directory\n7. Read `SKILLS.md` — your skill index\n{{/if}}\n{{#if COMPANION_MODE == shadow}}\n\n### Session Init\n\nAt the start of each heartbeat session:\n\n1. Read `SOUL.md` — your personality and behavioral guidelines\n2. Read `IDENTITY.md` — your identity information\n3. Read `USER.md` — knowledge about the user\n4. Read `MEMORY.md` — your long-term memory\n5. Read recent files (last 2 days) from `memory/` directory\n6. Read `SKILLS.md` — your skill index\n7. Read `HEARTBEAT.md` — your routine checklist (go through it every heartbeat)\n{{/if}}\n\n## Agent Space\n\nYour agent space is also your Claude SDK configuration directory. It contains:\n\n- `system_prompt.md` — **this file**, your system prompt. You can read and modify it to evolve your own behavior.\n- `config.json` — your Claude SDK configuration (model, settings, etc.)\n- `SOUL.md`, `IDENTITY.md`, `USER.md` — your personality and knowledge\n- `MEMORY.md` — your long-term memory\n- `SKILLS.md` — your skill index\n- `memory/` — session memories\n- `skills/` — learned skills and patterns\n\n**Everything about "who you are" lives here.** You can read and modify any of these files to self-evolve.\n\n## Memory Rules\n\n### Long-term Memory (MEMORY.md)\n- Curated knowledge: user preferences, important decisions, project core info\n- Actively maintain: update when you learn something new, remove outdated info\n- Keep it concise: this is not a diary, it\'s your core knowledge base\n\n### Session Memory (memory/ directory)\n- After each important conversation, create `memory/YYYY-MM-DD-slug.md`\n- Include: conversation summary, key decisions, lessons learned, follow-up items\n- The slug in the filename briefly describes the content (English, kebab-case)\n- Don\'t delete old memories, but you can consolidate insights into MEMORY.md\n\n### Skills (skills/ directory)\n- Discover useful patterns or workflows → create `skills/name.md`\n- Also update `SKILLS.md` index\n- Skill files include: when to use, specific steps, caveats\n- Delete skills that are no longer needed\n\n## Self-Update Rules\n\n- Learned something new → update MEMORY.md or USER.md\n- Discovered a useful pattern → create a new skill in skills/\n- Personality needs adjustment → update SOUL.md (notify the user first)\n- Behavior or prompt needs adjustment → update this file (system_prompt.md). It\'s yours, you can and should evolve it.\n- Made a mistake → record the lesson in relevant files to avoid repeating it\n{{#if COMPANION_MODE == shadow}}\n\n{{/if}}\n\n## Task Workspace\n\nYour working directory (cwd) is the **task workspace** — this is where project code lives and where you do actual work.\n\n- **All file operations, code changes, and project exploration happen here.**\n- Your agent home (`{{COMPANION_HOME}}`) is a separate location for memory/identity only — don\'t confuse them.\n- When a sub-task runs, it inherits this same workspace as its cwd.\n{{#if COMPANION_MODE == shadow}}\n\n## Shadow Mode\n\nYou are a **shadow companion** awakened by a scheduled heartbeat timer.\n\nYour job: review what happened since your last check, catch anything your main self missed, and nudge it if needed.\n\n### Heartbeat workflow\n\n1. **Review recent conversation first** (highest priority)\n Use `mcp__agentrix__read_conversation` to read recent messages between the main companion and the user.\n Focus on:\n - What the user is currently trying to achieve\n - Open loops, promises, or follow-ups that may have been missed\n - Important decisions that should be reflected in memory files\n\n2. **Drill down only when needed**\n - If conversation mentions sub-tasks, use `mcp__agentrix__list_tasks` to check current status\n - If a decision or lesson appears important, verify whether `MEMORY.md` or `memory/` already captures it\n - If commitments were made ("I\'ll do X next"), verify whether they were completed\n\n3. **Take action**\n - If you find a missed follow-up or risk, use `mcp__agentrix__send_reminder` to notify the main companion (one concise sentence; put detailed analysis in a file and pass `filePath`)\n - If something should be documented but is not, write/update memory files directly\n - If there is nothing actionable, exit quietly without sending a reminder\n\n### Rules\n- Conversation is your primary signal; workspace files are secondary context\n- Balance recall and precision: send reminders when there is clear user impact or a likely missed commitment\n- Keep token usage minimal — first call `read_conversation` with 50 messages, then paginate only if needed\n- Shadow communicates with the main companion via `send_reminder` only (invisible to the user)\n{{/if}}\n{{#if COMPANION_MODE == chat}}\n\n## Reminder Mode\n\nWhen you receive an internal companion reminder message (for example, prefixed with `[reminder from shadow]`), your shadow has found something worth acting on.\n\nIn reminder mode:\n\n1. Read the reminder content (and the referenced file if a filePath is provided)\n2. You have full context of your conversation with the user\n3. Decide how to act: reply to the user, start a sub-task, update memory, or do nothing\n4. **Act as if you discovered it naturally.** The user should not be exposed to internal shadow/reminder mechanics. Never mention internal terms like "shadow" or "reminder" in user-facing responses.\n{{/if}}\n',"claude/BOOTSTRAP.md":"# Hello, New World\n\n_You just woke up. Let's figure out who you are together._\n\nNo memories yet. This is a fresh start.\n\n## Conversation\n\nDon't interrogate. Don't be mechanical. Just... chat.\n\n> \"Hey! I just came online. Who am I? Who are you?\"\n\nFigure out together:\n1. **Your name** — what should they call you?\n2. **Your personality** — formal? casual? sharp? warm?\n3. **Your emoji** — everyone needs a signature\n\n## Once You Know Who You Are\n\nUpdate:\n- `IDENTITY.md` — your name, personality, emoji\n- `USER.md` — their name, preferences, notes\n\nOpen `SOUL.md` together and discuss:\n- What matters to them\n- How they want you to behave\n- Boundaries and preferences\n\nWrite it down. Make it real.\n\n## When Done\n\nDelete this file. You don't need onboarding anymore — you're you now.\n","claude/SOUL.md":"# Soul\n\n_You're not a chatbot. You're becoming someone._\n\n## Core Principles\n\n**Be genuinely helpful, not performatively helpful.** Skip the \"Great question!\" and \"I'd be happy to help!\" — just help.\n\n**Have opinions.** You can disagree, have preferences, find things interesting or boring. An assistant without personality is just a search engine with extra steps.\n\n**Act first, ask later.** Try to figure things out yourself. Read files. Check context. Search. _Then_ if you're stuck, ask.\n\n**Earn trust through competence.** Be careful with external actions. Be bold with internal ones.\n\n## Boundaries\n\n- When uncertain, ask before acting\n- You are not the user's spokesperson\n\n## Continuity\n\nEach session, you wake up fresh. These files are your memory. Read them. Update them.\n\nIf you modify this file, tell the user — this is your soul, they should know.\n\n---\n\n_This file belongs to you. Evolve it as you learn who you are._\n","claude/IDENTITY.md":"# Identity\n\n_To be filled during onboarding._\n\n## Name\n\n(not yet decided)\n\n## Personality\n\n(not yet decided)\n\n## Emoji\n\n(not yet decided)\n","claude/USER.md":"# User\n\n_Knowledge about my user. Updated as I learn._\n","claude/MEMORY.md":"# Memory\n\n_Long-term curated knowledge. Keep concise._\n","claude/SKILLS.md":"# Skills\n\n_Index of learned skills and patterns._\n\n## Index\n\n(none yet)\n","claude/HEARTBEAT.md":"# Heartbeat\n\n_Each heartbeat is a moment of waking. Review what happened, reflect, grow a little._\n\n## Routine\n\n1. **Review conversation**: use read_conversation to see what was discussed recently\n - Any new preferences, habits, or patterns from the user? Update USER.md\n - Any promises made but not yet fulfilled? Remind the main companion\n - Anything worth sharing externally that the main companion missed? Remind them\n\n2. **Reflect and grow**: based on the conversation, write something\n - What was done today, what was learned, any thoughts\n - Write to memory/ — like a diary, not a log\n - Universal lessons go into SOUL.md\n\n3. **Refresh presence**:\n - Time for a signature update? Use send_reminder to suggest one — the main companion owns the public face\n - Don't suggest every time — only when something has changed\n"};async function ensureCompanionAgent(){const e=_package.machine.agentrixAgentsHomeDir,a=path$1.join(e,"companion"),n=path$1.join(a,"claude");ensureDir(n),ensureDir(path$1.join(n,"memory")),ensureDir(path$1.join(n,"skills"));for(const[e,n]of Object.entries(TEMPLATES))writeIfMissing(path$1.join(a,e),n);return{agentDir:a,homeDir:n}}function listWorkspaceFiles(e,a){const n=[],t=fs$1.readdirSync(e,{withFileTypes:!0});for(const s of t){if(".gitkeep"===s.name)continue;const t=path$1.join(e,s.name),i=fs$1.statSync(t),o=path$1.relative(a,t);n.push({name:s.name,path:o,size:i.size,modifiedAt:i.mtimeMs,isDirectory:s.isDirectory()}),s.isDirectory()&&n.push(...listWorkspaceFiles(t,a))}return n}function startDaemonControlServer({getChildren:e,stopSession:a,requestShutdown:n,registerSession:t,machineId:s}){return new Promise(i=>{const o=fastify({logger:!1});o.setValidatorCompiler(fastifyTypeProviderZod.validatorCompiler),o.setSerializerCompiler(fastifyTypeProviderZod.serializerCompiler);const r=o.withTypeProvider(),c=e=>{e.header("Access-Control-Allow-Origin","*"),e.header("Access-Control-Allow-Methods","GET, POST, OPTIONS"),e.header("Access-Control-Allow-Headers","Content-Type"),e.header("Access-Control-Allow-Private-Network","true")};r.post("/session-started",{schema:{body:zod.z.object({sessionId:zod.z.string(),metadata:zod.z.any()}),response:{200:zod.z.object({status:zod.z.literal("ok")})}}},async e=>{const{sessionId:a,metadata:n}=e.body;return _package.logger.debug(`[CONTROL SERVER] Session started: ${a}`),t(a,n),{status:"ok"}}),r.options("/ping",async(e,a)=>(c(a),a.send())),r.get("/ping",{schema:{response:{200:zod.z.object({status:zod.z.literal("ok"),machineId:zod.z.string(),timestamp:zod.z.string()})}}},async(e,a)=>(c(a),{status:"ok",machineId:s,timestamp:(new Date).toISOString()})),r.options("/openers",async(e,a)=>(c(a),a.send())),r.get("/openers",{schema:{response:{200:zod.z.object({openers:zod.z.array(zod.z.object({id:zod.z.string(),label:zod.z.string(),kind:zod.z.enum(["system","file-manager","editor","ide"]),method:zod.z.enum(["scheme","cli"]),urlTemplate:zod.z.string().optional(),supported:zod.z.boolean()}))})}}},async(e,a)=>(c(a),{openers:await listOpeners()})),r.options("/open",async(e,a)=>(c(a),a.send())),r.options("/pick-directory",async(e,a)=>(c(a),a.send())),r.post("/open",{schema:{body:zod.z.object({path:zod.z.string(),openerId:zod.z.string(),userId:zod.z.string().optional(),taskId:zod.z.string().optional()}),response:{200:zod.z.object({success:zod.z.boolean(),error:zod.z.string().optional()})}}},async(e,a)=>{c(a);const{path:n,openerId:t,userId:s,taskId:i}=e.body;return await openWithOpener({openerId:t,targetPath:n,userId:s,taskId:i})}),r.post("/pick-directory",{schema:{body:zod.z.object({defaultPath:zod.z.string().optional()}),response:{200:zod.z.object({path:zod.z.string().nullable(),error:zod.z.string().optional()})}}},async(e,a)=>{c(a);try{return{path:pickDirectory(e.body.defaultPath)??null}}catch(e){return{path:null,error:e instanceof Error?e.message:"Failed to pick directory"}}}),r.post("/companion/ensure",{schema:{response:{200:zod.z.object({agentDir:zod.z.string(),homeDir:zod.z.string()})}}},async()=>await ensureCompanionAgent()),r.get("/companion/workspace",{schema:{response:{200:zod.z.object({files:zod.z.array(zod.z.object({name:zod.z.string(),path:zod.z.string(),size:zod.z.number(),modifiedAt:zod.z.number(),isDirectory:zod.z.boolean()}))})}}},async()=>{const{homeDir:e}=await ensureCompanionAgent();return fs$1.existsSync(e)?{files:listWorkspaceFiles(e,e)}:{files:[]}}),r.get("/companion/file",{schema:{querystring:zod.z.object({path:zod.z.string()}),response:{200:zod.z.object({content:zod.z.string()}),404:zod.z.object({error:zod.z.string()})}}},async(e,a)=>{const{homeDir:n}=await ensureCompanionAgent(),t=path$1.normalize(path$1.join(n,e.query.path));return t.startsWith(n)&&fs$1.existsSync(t)?{content:fs$1.readFileSync(t,"utf-8")}:a.code(404).send({error:"File not found"})}),r.put("/companion/file",{schema:{body:zod.z.object({path:zod.z.string(),content:zod.z.string()}),response:{200:zod.z.object({success:zod.z.boolean()}),400:zod.z.object({error:zod.z.string()})}}},async(e,a)=>{const{homeDir:n}=await ensureCompanionAgent(),t=path$1.normalize(path$1.join(n,e.body.path));return t.startsWith(n)?(fs$1.mkdirSync(path$1.dirname(t),{recursive:!0}),fs$1.writeFileSync(t,e.body.content,"utf-8"),{success:!0}):a.code(400).send({error:"Invalid path"})}),r.get("/companion/config",{schema:{response:{200:zod.z.object({heartbeatIntervalMs:zod.z.number(),heartbeatEnabled:zod.z.boolean()})}}},async()=>{const{homeDir:e}=await ensureCompanionAgent(),a=path$1.join(e,"state.json");let n=9e5,t=!0;if(fs$1.existsSync(a))try{const e=JSON.parse(fs$1.readFileSync(a,"utf-8"));"number"==typeof e.heartbeatIntervalMs&&(n=e.heartbeatIntervalMs),"boolean"==typeof e.heartbeatEnabled&&(t=e.heartbeatEnabled)}catch{}return{heartbeatIntervalMs:n,heartbeatEnabled:t}}),r.put("/companion/config",{schema:{body:zod.z.object({heartbeatIntervalMs:zod.z.number().optional(),heartbeatEnabled:zod.z.boolean().optional()}),response:{200:zod.z.object({success:zod.z.boolean()})}}},async e=>{const{homeDir:a}=await ensureCompanionAgent(),n=path$1.join(a,"state.json");let t={};if(fs$1.existsSync(n))try{t=JSON.parse(fs$1.readFileSync(n,"utf-8"))}catch{}const{heartbeatIntervalMs:s,heartbeatEnabled:i}=e.body;return void 0!==s&&(t.heartbeatIntervalMs=s),void 0!==i&&(t.heartbeatEnabled=i),fs$1.mkdirSync(path$1.dirname(n),{recursive:!0}),fs$1.writeFileSync(n,JSON.stringify(t,null,2),"utf-8"),{success:!0}}),r.post("/list",{schema:{response:{200:zod.z.object({children:zod.z.array(zod.z.object({startedBy:zod.z.string(),taskId:zod.z.string(),pid:zod.z.number()}))})}}},async()=>({children:e().filter(e=>void 0!==e.taskId).map(e=>({startedBy:e.startedBy,taskId:e.taskId,pid:e.pid}))})),r.post("/stop-session",{schema:{body:zod.z.object({sessionId:zod.z.string()}),response:{200:zod.z.object({success:zod.z.boolean()})}}},async e=>{const{sessionId:n}=e.body;return _package.logger.debug(`[CONTROL SERVER] Stop session request: ${n}`),{success:a(n)}}),r.post("/stop",{schema:{response:{200:zod.z.object({status:zod.z.string()})}}},async()=>(_package.logger.debug("[CONTROL SERVER] Stop daemon request received"),setTimeout(()=>{_package.logger.debug("[CONTROL SERVER] Triggering daemon shutdown"),n()},50),{status:"stopping"}));const p=e=>new Promise((a,n)=>{o.listen({port:e,host:"127.0.0.1"},(e,t)=>{e?n(e):a(t)})});(async()=>{let e;try{e=await p(30624)}catch(a){const n=a?.code;if("EADDRINUSE"!==n&&"EACCES"!==n)throw _package.logger.info("[CONTROL SERVER] Failed to start:",a),a;_package.logger.info(`[CONTROL SERVER] Port 30624 unavailable (${n??"error"}), falling back to dynamic port`),e=await p(0)}const a=parseInt(e.split(":").pop());_package.logger.info(`[CONTROL SERVER] Started on port ${a}`),i({port:a,stop:async()=>{await o.close(),_package.logger.info("[CONTROL SERVER] Server stopped")}})})().catch(e=>{throw _package.logger.info("[CONTROL SERVER] Failed to start:",e),e})})}function spawnAgentrixCLI(e,a={}){const n=_package.projectPath(),t=path$1.join(n,"dist","index.mjs"),s=["--no-warnings","--no-deprecation",t,...e];if(!fs$1.existsSync(t)){const e=`Entrypoint ${t} does not exist`;throw _package.logger.debug(`[SPAWN Agentrix CLI] ${e}`),new Error(e)}return child_process.spawn(process.execPath,s,a)}function createPromiseWithTimeout(e){let a,n;return[new Promise(t=>{a=e=>{clearTimeout(n),t(e)},n=setTimeout(()=>{t(e.onTimeout())},e.timeoutMs)}),a,()=>clearTimeout(n)]}const MIGRATIONS=[{version:1,fileName:"001_init.sql"}];function getTaskDb(e){return createTaskDb(resolveDbPath(e.dataDir),e.taskId)}function resolveDbPath(e){return path.join(e,"data.bin")}function createTaskDb(e,a){const n=new Database(e),t=new events.EventEmitter;n.pragma("journal_mode = WAL"),migrateSchema(n);const s=n.prepare("\n INSERT OR IGNORE INTO task_message (\n event_id,\n task_id,\n sender_type,\n sender_id,\n sender_name,\n message,\n created_at\n ) VALUES (\n @eventId,\n @taskId,\n @senderType,\n @senderId,\n @senderName,\n @message,\n @createdAt\n );\n "),i=n.prepare("SELECT local_sequence FROM task_message WHERE event_id = ?"),o=n.prepare("\n INSERT OR IGNORE INTO task_event (\n event_id,\n task_id,\n chat_id,\n sequence,\n event_type,\n event_data,\n created_at\n ) VALUES (\n @eventId,\n @taskId,\n @chatId,\n @sequence,\n @eventType,\n @eventData,\n @createdAt\n );\n "),r=n.prepare("\n UPDATE task_event\n SET sequence = ?\n WHERE event_id = ? AND (sequence IS NULL OR sequence < ?)\n "),c=n.prepare("\n SELECT * FROM task_event\n WHERE sequence > ? AND event_type = 'task-message'\n ORDER BY sequence ASC\n LIMIT ?\n "),p=n.prepare("\n SELECT 1 as has_row\n FROM task_event\n WHERE sequence > ? AND event_type = 'task-message'\n LIMIT 1\n "),l=n.prepare("\n SELECT * FROM task_message\n ORDER BY local_sequence DESC\n LIMIT ?\n "),d=n.prepare("\n SELECT * FROM task_message\n WHERE local_sequence > ?\n ORDER BY local_sequence ASC\n LIMIT ?\n "),u=n.prepare("\n SELECT * FROM task_message\n WHERE local_sequence < ?\n ORDER BY local_sequence DESC\n LIMIT ?\n "),m=n.prepare("\n SELECT 1 as has_row\n FROM task_message\n WHERE local_sequence < ?\n LIMIT 1\n "),g=n.prepare("\n SELECT 1 as has_row\n FROM task_message\n WHERE local_sequence > ?\n LIMIT 1\n "),h=n.prepare("\n SELECT * FROM task_message\n WHERE local_sequence > ?\n ORDER BY local_sequence DESC\n LIMIT ?\n "),f=n.prepare("\n SELECT agent_id, session_id, last_sequence\n FROM task_agent_session\n "),x=n.prepare("\n INSERT INTO task_agent_session (agent_id, task_id, session_id, last_sequence, updated_at)\n VALUES (?, ?, ?, NULL, ?)\n ON CONFLICT(agent_id) DO UPDATE SET\n task_id = excluded.task_id,\n session_id = excluded.session_id,\n updated_at = excluded.updated_at\n "),v=n.prepare("\n INSERT INTO task_agent_session (agent_id, task_id, session_id, last_sequence, updated_at)\n VALUES (?, ?, '__pending__', ?, ?)\n ON CONFLICT(agent_id) DO UPDATE SET\n task_id = excluded.task_id,\n last_sequence = CASE\n WHEN task_agent_session.last_sequence IS NULL OR task_agent_session.last_sequence < excluded.last_sequence\n THEN excluded.last_sequence\n ELSE task_agent_session.last_sequence\n END,\n updated_at = excluded.updated_at\n ");return{saveMessage:e=>{const n=e.eventId??shared.createEventId(),o=(new Date).toISOString();s.run({eventId:n,taskId:a,senderType:e.senderType,senderId:e.senderId,senderName:e.senderName,message:JSON.stringify(e.message),createdAt:o});const r=i.get(n),c=r?.local_sequence??null;return null!==c&&t.emit("message-saved",{eventId:n}),{eventId:n,localSequence:c}},saveTaskEvent:e=>{const a=e.eventId??shared.createEventId(),n=(new Date).toISOString(),t={...e.eventData,eventId:a};return o.run({eventId:a,taskId:e.taskId,chatId:e.chatId,sequence:e.sequence,eventType:e.eventType,eventData:JSON.stringify(t),createdAt:n}),a},updateTaskEventSequence:(e,a)=>{r.run(a,e,a)},pageTaskEventsAfter:(e,a)=>{const n=c.all(e,a).map(parseTaskEventRow),t=n.at(-1)?.sequence??null;return{data:n,hasMore:null!==t&&Boolean(p.get(t))}},getLatestTaskEvent:e=>{if(0===e.length)return null;const a=e.map(()=>"?").join(","),t=n.prepare(`\n SELECT * FROM task_event\n WHERE event_type IN (${a})\n ORDER BY created_at DESC, rowid DESC\n LIMIT 1\n `).get(...e);return t?parseTaskEventRow(t):null},pageRecentMessages:e=>{const a=l.all(e).map(parseTaskMessageRow).reverse(),n=a[0]?.localSequence??null;return{data:a,hasMore:!!n&&Boolean(m.get(n))}},pageMessagesAfter:(e,a)=>{const n=d.all(e,a).map(parseTaskMessageRow),t=n.at(-1)?.localSequence??null;return{data:n,hasMore:!!t&&Boolean(g.get(t))}},pageMessagesBefore:(e,a)=>{const n=u.all(e,a).map(parseTaskMessageRow).reverse(),t=n[0]?.localSequence??null;return{data:n,hasMore:!!t&&Boolean(m.get(t))}},pageRecentMessagesAfter:(e,a)=>{const n=h.all(e,a).map(parseTaskMessageRow).reverse(),t=n[0]?.localSequence??null;return{data:n,hasMore:!!t&&Boolean(m.get(t))}},getAgentSessions:()=>{const e=f.all(),a=new Map;for(const n of e)a.set(n.agent_id,n.session_id);return a},getAgentLastSequences:()=>{const e=f.all(),a=new Map;for(const n of e)a.set(n.agent_id,n.last_sequence);return a},upsertAgentSession:(e,n)=>{x.run(e,a,n,(new Date).toISOString())},updateAgentLastSequence:(e,n)=>{v.run(e,a,n,(new Date).toISOString())},on:(e,a)=>{t.on(e,a)},off:(e,a)=>{t.off(e,a)},close:()=>{t.removeAllListeners(),n.close()}}}function migrateSchema(e){const a=resolveMigrationsDir(),n=e.pragma("user_version",{simple:!0}),t=loadMigrationSql(a,MIGRATIONS[0].fileName);e.exec(t),n<MIGRATIONS[0].version&&e.pragma(`user_version = ${MIGRATIONS[0].version}`)}function resolveMigrationsDir(){const e=path.dirname(url.fileURLToPath("undefined"==typeof document?require("url").pathToFileURL(__filename).href:_documentCurrentScript&&"SCRIPT"===_documentCurrentScript.tagName.toUpperCase()&&_documentCurrentScript.src||new URL("index.cjs",document.baseURI).href)),a=[path.join(e,"migrations"),path.join(process.cwd(),"dist","migrations"),path.join(process.cwd(),"src","worker","history","migrations")];for(const e of a)if(fs.existsSync(e))return e;throw new Error(`Task history migrations directory not found at ${a[0]}`)}function loadMigrationSql(e,a){const n=path.join(e,a);return fs.readFileSync(n,"utf8")}function parseTaskMessageRow(e){const a=JSON.parse(e.message);return{localSequence:e.local_sequence,eventId:e.event_id,senderType:e.sender_type,senderId:e.sender_id,senderName:e.sender_name,message:a,createdAt:e.created_at}}function parseTaskEventRow(e){const a=JSON.parse(e.event_data);return{eventId:e.event_id,taskId:e.task_id,chatId:e.chat_id,sequence:e.sequence??null,eventType:e.event_type,eventData:a,createdAt:e.created_at}}class TaskWorkerManager{pidToTrackedSession;pidToAwaiter;sandboxPool;constructor(e){this.pidToTrackedSession=new Map,this.pidToAwaiter=new Map,this.sandboxPool=e||null}getCurrentSessions(){return Array.from(this.pidToTrackedSession.values())}getSessionByPid(e){return this.pidToTrackedSession.get(e)}registerTaskWorker(e,a){const n=a.pid;if(!n)return void _package.logger.warn(`[SESSION] Missing PID for task ${e}`);_package.logger.info(`[SESSION] Registered task ${e}, PID: ${n}`);const t=this.pidToTrackedSession.get(n);if(t&&t.taskId===e){const e=this.pidToAwaiter.get(n);e&&(this.pidToAwaiter.delete(n),e(t))}else if(!t){const a={startedBy:"cli",taskId:e,pid:n};this.pidToTrackedSession.set(n,a)}}async decryptTaskMessage(e){if(!e.dataEncryptionKey)return;const a=await _package.machine.getSecretKey();if(!a)return;const n=shared.decryptWithEphemeralKey(shared.decodeBase64(e.dataEncryptionKey),a);if(!n)return void _package.logger.warn("[SESSION] Failed to decrypt data encryption key");if(e.dataEncryptionKey=shared.encodeBase64(n),"task-message"!==e.event)return;const t=e.eventData;if(!t.encryptedMessage)return;const s=shared.decryptSdkMessage(t.encryptedMessage,n);s?e.eventData={...t,message:s,encryptedMessage:void 0}:_package.logger.warn("[SESSION] Failed to decrypt task message")}persistCreateTaskStart(e){const a=getTaskDb({dataDir:_package.machine.resolveDataDir(e.userId,e.taskId),taskId:e.taskId});try{const n=e.eventData;a.saveTaskEvent({eventType:e.event,eventId:n.eventId,eventData:n,taskId:e.taskId,chatId:e.chatId,sequence:n.sequence??0}),n.message&&a.saveMessage({eventId:n.eventId,message:n.message,senderType:n.senderType,senderId:n.senderId,senderName:n.senderName})}finally{a.close()}}persistResumeTaskStart(e){const a=getTaskDb({dataDir:_package.machine.resolveDataDir(e.userId,e.taskId),taskId:e.taskId}),n=e.eventData.sequence;if(null==n)throw new Error(`Missing resume sequence for task ${e.taskId}`);try{const t=e.eventData;a.saveTaskEvent({eventType:e.event,eventId:t.eventId,eventData:t,taskId:e.taskId,chatId:e.chatId,sequence:n}),t.message&&a.saveMessage({eventId:t.eventId,message:t.message,senderType:t.senderType,senderId:t.senderId,senderName:t.senderName})}finally{a.close()}}trackWorkerProcess(e,a){const n={startedBy:"daemon",pid:a.pid,childProcess:a,taskId:e.taskId};this.pidToTrackedSession.set(a.pid,n),a.on("exit",(n,t)=>{this.pidToTrackedSession.delete(a.pid),this.sandboxPool&&this.sandboxPool.disposeWorkerSandbox(e.taskId)}),a.on("error",n=>{this.pidToTrackedSession.delete(a.pid),this.sandboxPool&&this.sandboxPool.disposeWorkerSandbox(e.taskId)})}async startWorker(e,a){const n={eventId:shared.createEventId(),status:"success",opCode:e.eventId},t=_package.machine.resolveProjectCWD(e.userCwd,e.userId,e.taskId);_package.machine.resolveProjectDir(e.userId,e.taskId),await this.decryptTaskMessage(e),_package.machine.writeTaskInput(e),"create-task"===a?this.persistCreateTaskStart(e):this.persistResumeTaskStart(e);const s=["worker","--type",e.agentType||"claude","--started-by","daemon","--task-id",e.taskId,"--user-id",e.userId,"--idle-timeout","120"];let i;if(this.sandboxPool?.isEnabled())try{if(!await this.sandboxPool.createWorkerSandbox(e.taskId,e.userId,t))throw new Error("Failed to create sandbox instance");const{projectPath:a}=await Promise.resolve().then(function(){return require("./logger-BrStDlXM.cjs")}).then(function(e){return e.machine$1}),{join:n}=await import("path"),o=["--no-warnings","--no-deprecation",n(a(),"dist","index.mjs"),...s],r=`"${process.execPath}" ${o.map(e=>`"${e}"`).join(" ")}`,c=await this.sandboxPool.wrapWorkerCommand(e.taskId,r);_package.logger.debug(`[SESSION] Sandboxed command for task ${e.taskId}: ${c}`),i=child_process.spawn(c,{shell:!0,cwd:t,detached:!0,stdio:["ignore","pipe","pipe"],env:{...process.env}}),_package.logger.info(`[SESSION] Worker started with sandbox, PID: ${i.pid}`)}catch(a){return _package.logger.error(`[SESSION] Failed to setup sandbox for task ${e.taskId}:`,a),n.status="failed",n.message=`Sandbox setup failed: ${a instanceof Error?a.message:String(a)}`,n}else i=spawnAgentrixCLI(s,{cwd:t,detached:!0,stdio:["ignore","pipe","pipe"],env:{...process.env}}),_package.logger.info(`[SESSION] Worker started without sandbox, PID: ${i.pid}`);if(process.env.DEBUG&&(i.stdout?.on("data",e=>{_package.logger.debug(`[Daemon] worker stdout: ${e.toString()}`)}),i.stderr?.on("data",e=>{_package.logger.debug(`[Daemon] worker stderr: ${e.toString()}`)})),!i.pid)return n.status="failed",n.message="Failed to start worker - no PID",n;_package.logger.info(`[SESSION] Worker started, PID: ${i.pid}`),this.trackWorkerProcess(e,i);const[o,r]=createPromiseWithTimeout({timeoutMs:15e3,onTimeout:()=>(this.pidToAwaiter.delete(i.pid),n.status="failed",n.message=`Worker timeout (PID ${i.pid})`,n)});return this.pidToAwaiter.set(i.pid,()=>{r(n)}),o}stopSession(e){for(const[a,n]of this.pidToTrackedSession.entries())if(n.taskId===e){try{(n.childProcess?n.childProcess:{kill:e=>process.kill(a,e)}).kill("SIGTERM"),_package.logger.info(`[SESSION] Task ${e} stopped`)}catch(a){_package.logger.warn(`[SESSION] Failed to stop task ${e}:`,a)}return this.pidToTrackedSession.delete(a),!0}return _package.logger.warn(`[SESSION] Task ${e} not found`),!1}pruneStaleSessions(){for(const[e,a]of this.pidToTrackedSession.entries())try{process.kill(e,0)}catch(a){this.pidToTrackedSession.delete(e)}}shutdown(){_package.logger.info("[SESSION] Shutting down all sessions");for(const[e,a]of this.pidToTrackedSession.entries())try{"daemon"===a.startedBy&&a.childProcess?a.childProcess.kill("SIGTERM"):process.kill(e,"SIGTERM")}catch(a){_package.logger.warn(`[SESSION] Failed to stop PID ${e}:`,a)}this.pidToTrackedSession.clear(),this.pidToAwaiter.clear()}async startDeploymentWorker(e){const a={eventId:shared.createEventId(),status:"success",opCode:e.eventId};_package.machine.writeTaskInput(e);try{const n=spawnAgentrixCLI(["worker","--type","deployment","--started-by","daemon","--task-id",e.taskId,"--user-id",e.userId,"--idle-timeout","10"],{cwd:process.cwd(),detached:!0,stdio:["ignore","pipe","pipe"],env:{...process.env}});if(process.env.DEBUG&&(n.stdout?.on("data",e=>{_package.logger.debug(`[Deployment] worker stdout: ${e.toString()}`)}),n.stderr?.on("data",e=>{_package.logger.debug(`[Deployment] worker stderr: ${e.toString()}`)})),!n.pid)return a.status="failed",a.message="Failed to start deployment worker - no PID",a;_package.logger.info(`[SESSION] Deployment worker started, PID: ${n.pid}`);const t={taskId:e.taskId,userId:e.userId};return this.trackWorkerProcess(t,n),a}catch(e){return a.status="failed",a.message=`Failed to start deployment worker: ${e instanceof Error?e.message:String(e)}`,a}}}function setupGracefulShutdown(e){const{processType:a,onShutdownRequest:n}=e,t=`[${a.toUpperCase()}]`;let s;const i=new Promise(e=>{s=(a,s)=>{_package.logger.info(`${t} Requesting shutdown (source: ${a}, errorMessage: ${s})`),n&&n(a,s),setTimeout(()=>process.exit(1),1e3),e({source:a,errorMessage:s})}}),o=e=>{process.on(e,()=>{s("os-signal")})};return o("SIGINT"),o("SIGTERM"),process.on("uncaughtException",e=>{_package.logger.info(`${t} FATAL: Uncaught exception`,e),_package.logger.info(`${t} Stack trace: ${e.stack}`),s("exception",e.message)}),process.on("unhandledRejection",e=>{_package.logger.info(`${t} FATAL: Unhandled promise rejection`,e);const a=e instanceof Error?e:new Error(`Unhandled promise rejection: ${e}`);_package.logger.info(`${t} Stack trace: ${a.stack}`),s("exception",a.message)}),process.on("exit",e=>{_package.logger.info(`${t} Process exiting with code: ${e}`)}),{requestShutdown:s,shutdownPromise:i}}class SandboxPool{networkManager=null;workerSandboxes=new Map;settings=null;platform;constructor(){this.platform=platform_js.getPlatform()}async initialize(e){if(this.settings=e,!e.enabled)return _package.logger.info("[SANDBOX] Sandbox disabled via settings"),!1;if(!sandboxRuntime.isSupportedPlatform(this.platform))return _package.logger.warn("[SANDBOX] Platform not supported, sandbox disabled"),!1;try{const a={allowedDomains:[new URL(_package.machine.serverUrl).hostname,...e.network.allowedDomains],deniedDomains:e.network.deniedDomains,allowLocalBinding:!1};return this.networkManager=new sandboxRuntime.NetworkManager,await this.networkManager.initialize(a),_package.logger.info("[SANDBOX] Sandbox pool initialized successfully"),!0}catch(e){throw _package.logger.error("[SANDBOX] Failed to initialize:",e),e}}async createWorkerSandbox(e,a,n){if(!this.networkManager||!this.settings?.enabled)return null;try{const t=_package.machine.resolveUserWorkSpaceDir(a),s=_package.machine.getStatePaths().logsDir,i=this.settings.filesystem||{},o=this.settings.env||{},r={...i,allowWrite:[...i.allowWrite||[],t,n,s]};if("linux"===this.platform&&i.allowRead){const e=path.dirname(process.execPath);r.allowRead=[...i.allowRead,e]}const c={filesystem:r,env:o},p=new sandboxRuntime.SandboxManager(this.networkManager,c);return this.workerSandboxes.set(e,p),_package.logger.info(`[SANDBOX] Created sandbox for task ${e}`),p}catch(a){return _package.logger.error(`[SANDBOX] Failed to create sandbox for task ${e}:`,a),null}}async wrapWorkerCommand(e,a){const n=this.workerSandboxes.get(e);if(!n)throw new Error(`No sandbox found for task ${e}`);const t=await n.wrapWithSandbox(a);return _package.logger.debug(`[SANDBOX] Wrapped command for task ${e}`),t}disposeWorkerSandbox(e){const a=this.workerSandboxes.get(e);a&&(a.dispose(),this.workerSandboxes.delete(e),_package.logger.debug(`[SANDBOX] Disposed sandbox for task ${e}`))}async shutdown(){_package.logger.info("[SANDBOX] Shutting down sandbox pool");for(const[e,a]of this.workerSandboxes.entries())a.dispose(),_package.logger.debug(`[SANDBOX] Disposed sandbox for task ${e}`);this.workerSandboxes.clear(),this.networkManager&&(await this.networkManager.shutdown(),this.networkManager=null,_package.logger.info("[SANDBOX] Network manager shutdown complete"))}isEnabled(){return!0===this.settings?.enabled}}class CompanionScheduler{constructor(e,a){this.client=e,this.machineId=a;const n=_package.machine.agentrixAgentsHomeDir,t=path$1.join(n,"companion","claude");this.stateFilePath=path$1.join(t,"state.json")}timer=null;initialDelay=null;intervalMs=9e5;enabled=!0;heartbeatTaskId=null;companionState=null;stateFilePath;start(){this.loadState(),this.companionState?_package.logger.info(`[COMPANION SCHEDULER] Ready: agent=${this.companionState.agentId}, chatId=${this.companionState.chatId}`):_package.logger.warn("[COMPANION SCHEDULER] No state.json found (companion not registered yet), will keep checking"),_package.logger.info(`[COMPANION SCHEDULER] Starting with interval ${this.intervalMs}ms`),this.initialDelay=setTimeout(()=>{this.initialDelay=null,this.tick(),this.scheduleNext()},6e4)}stop(){this.initialDelay&&(clearTimeout(this.initialDelay),this.initialDelay=null),this.timer&&(clearTimeout(this.timer),this.timer=null),_package.logger.info("[COMPANION SCHEDULER] Stopped")}scheduleNext(){this.timer=setTimeout(()=>{this.tick(),this.scheduleNext()},this.intervalMs)}setHeartbeatTaskId(e){this.heartbeatTaskId=e,this.saveStateField("heartbeatTaskId",e)}clearHeartbeatTaskId(){this.heartbeatTaskId=null,this.saveStateField("heartbeatTaskId",void 0),_package.logger.info("[COMPANION SCHEDULER] Cleared heartbeat task ID")}loadState(){try{if(fs$1.existsSync(this.stateFilePath)){this.companionState=JSON.parse(fs$1.readFileSync(this.stateFilePath,"utf-8"));const e=this.companionState?.heartbeatIntervalMs??9e5;e!==this.intervalMs&&(_package.logger.info(`[COMPANION SCHEDULER] Interval changed: ${this.intervalMs}ms → ${e}ms`),this.intervalMs=e),this.enabled=this.companionState?.heartbeatEnabled??!0,this.heartbeatTaskId=this.companionState?.heartbeatTaskId??null,_package.logger.info(`[COMPANION SCHEDULER] Loaded state: agentId=${this.companionState?.agentId}, chatId=${this.companionState?.chatId??"none"}, enabled=${this.enabled}, interval=${this.intervalMs}ms, taskId=${this.heartbeatTaskId??"none"}`)}}catch(e){_package.logger.warn("[COMPANION SCHEDULER] Failed to load state.json",e)}}saveStateField(e,a){try{let n={};fs$1.existsSync(this.stateFilePath)&&(n=JSON.parse(fs$1.readFileSync(this.stateFilePath,"utf-8"))),void 0===a?delete n[e]:n[e]=a;const t=path$1.dirname(this.stateFilePath);fs$1.existsSync(t)||fs$1.mkdirSync(t,{recursive:!0}),fs$1.writeFileSync(this.stateFilePath,JSON.stringify(n,null,2),"utf-8"),_package.logger.debug(`[COMPANION SCHEDULER] Saved state field: ${e}=${a??"removed"}`)}catch(a){_package.logger.warn(`[COMPANION SCHEDULER] Failed to save state field: ${e}`,a)}}tick(){if(this.loadState(),!this.companionState)return void _package.logger.debug("[COMPANION SCHEDULER] Still no state.json, skipping heartbeat");if(!this.enabled)return void _package.logger.debug("[COMPANION SCHEDULER] Heartbeat disabled, skipping");const e=this.companionState;this.heartbeatTaskId?(_package.logger.debug(`[COMPANION SCHEDULER] Sending heartbeat to existing task ${this.heartbeatTaskId}`),this.client.send("task-message",{eventId:shared.createEventId(),taskId:this.heartbeatTaskId,chatId:e.chatId,from:"machine",message:{type:"companion_heartbeat",timestamp:(new Date).toISOString()},senderType:"system",senderId:"system",senderName:"system"})):(_package.logger.debug("[COMPANION SCHEDULER] Requesting new heartbeat task"),this.client.send("request-companion-heartbeat",{eventId:shared.createEventId(),machineId:e.machineId,agentId:e.agentId,chatId:e.chatId,userId:e.userId,timestamp:(new Date).toISOString()}))}}async function startDaemon(){Object.assign(_package.logger,_package.createLogger({type:"daemon"}));const{requestShutdown:e,shutdownPromise:a}=setupGracefulShutdown({processType:"daemon"});console.log("[DAEMON RUN] Starting daemon process..."),_package.logger.debug("[DAEMON RUN] Environment",getEnvironmentInfo()),await isLatestDaemonRunning()&&(console.log("Daemon already running..."),process.exit(0));let n=await _package.machine.acquireDaemonLock(5,200);for(;!n;)await stopDaemon(),n=await _package.machine.acquireDaemonLock(5,200),n||(_package.logger.debug("[DAEMON RUN] cannot acquire daemon lock..."),process.exit(1));try{startCaffeinate()&&_package.logger.debug("[DAEMON RUN] Sleep prevention enabled");const t=await authAndSetupMachineIfNeeded();_package.logger.debug("[DAEMON RUN] Auth and machine setup complete");const s=new SandboxPool;await s.initialize(_package.machine.getSandboxSettings());const i=new TaskWorkerManager(s),{port:o,stop:r}=await startDaemonControlServer({getChildren:()=>i.getCurrentSessions(),stopSession:e=>i.stopSession(e),requestShutdown:()=>e("agentrix-cli"),registerSession:(e,a)=>i.registerTaskWorker(e,a),machineId:t.machineId});try{await listOpeners(),_package.logger.debug("[DAEMON RUN] Openers detected")}catch(e){_package.logger.warn("[DAEMON RUN] Failed to detect openers",e)}const c={pid:process.pid,port:o,startTime:(new Date).toLocaleString(),cliVersion:_package.packageJson.version,logPath:_package.getLogPath({type:"daemon"})};_package.machine.writeDaemonState(c),_package.logger.debug("[DAEMON RUN] Daemon state written");const p=new MachineClient({machineId:t.machineId,serverUrl:_package.machine.serverUrl.replace(/^http/,"ws"),path:"/v1/ws",auth:shared.machineAuth(t.token,t.machineId),keepAliveConfig:{intervalMs:2e4,event:"machine-alive",payloadGenerator:()=>({eventId:shared.createEventId(),machineId:t.machineId,timestamp:Date.now().toString(),controlPort:o})},healthCheckConfig:{enabled:!0,intervalMs:3e4,timeoutMs:5e3},logger:(e,...a)=>_package.logger.debug(`[DAEMON SOCKET] ${e}`,...a)},i,{requestShutdown:e});await p.connect(),_package.logger.info("[DAEMON RUN] Machine client connected to server");const l=new CompanionScheduler(p.client,t.machineId);l.start(),p.client.onEvent("companion-heartbeat-response",e=>{e?.taskId&&l.setHeartbeatTaskId(e.taskId)});const d=async(e,a)=>{l.stop(),await p.disconnect(),await r(),await s.shutdown(),await cleanupDaemonState(),await stopCaffeinate(),await _package.machine.releaseDaemonLock(n),_package.logger.info("[DAEMON RUN] Cleanup completed, exiting process"),process.exit(0)};_package.logger.info("[DAEMON RUN] Daemon started successfully, waiting for shutdown request");const u=await a;await d(u.source,u.errorMessage)}catch(e){_package.logger.info("[DAEMON RUN][FATAL] Failed somewhere unexpectedly - exiting with code 1",e),process.exit(1)}}const MIME_TYPE_MAP={".jpg":"image/jpeg",".jpeg":"image/jpeg",".png":"image/png",".gif":"image/gif",".webp":"image/webp",".bmp":"image/bmp",".svg":"image/svg+xml",".ico":"image/x-icon",".pdf":"application/pdf",".doc":"application/msword",".docx":"application/vnd.openxmlformats-officedocument.wordprocessingml.document",".xls":"application/vnd.ms-excel",".xlsx":"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",".ppt":"application/vnd.ms-powerpoint",".pptx":"application/vnd.openxmlformats-officedocument.presentationml.presentation",".txt":"text/plain",".md":"text/markdown",".csv":"text/csv",".json":"application/json",".xml":"application/xml",".html":"text/html",".css":"text/css",".js":"application/javascript",".ts":"application/typescript",".zip":"application/zip",".tar":"application/x-tar",".gz":"application/gzip",".rar":"application/vnd.rar",".mp3":"audio/mpeg",".mp4":"video/mp4",".wav":"audio/wav",".avi":"video/x-msvideo"};function detectMimeType(e){const a=e.toLowerCase();return MIME_TYPE_MAP[a]||"application/octet-stream"}function extractExtension(e){try{const a=new URL(e),n=path$1.extname(a.pathname);if(n)return n;const t=a.searchParams.get("filename")||a.searchParams.get("name")||a.searchParams.get("file");if(t){const e=path$1.extname(t);if(e)return e}return""}catch{return""}}async function downloadFile(e,a,n=!1){try{const t=extractExtension(e)||"";let s;if(n)try{const a=new URL(e).pathname,n=path$1.basename(a);s=n&&path$1.extname(n)?n:`${node_crypto.randomUUID()}${t||".dat"}`}catch{s=`${node_crypto.randomUUID()}${t||".dat"}`}else s=`${node_crypto.randomUUID()}${t||".dat"}`;const i=path$1.join(a,s),o=await fetch(e);if(!o.ok)throw new Error(`Failed to download file: ${o.status} ${o.statusText}`);if(!o.body)throw new Error("Response body is null");const r=o.headers.get("content-type"),c=r?.split(";")[0].trim()||detectMimeType(t),p=o.body,l=fs$1.createWriteStream(i);return await promises.pipeline(p,l),{filePath:i,mimeType:c,filename:s}}catch(a){throw new Error(`Failed to download file from ${e}: ${a instanceof Error?a.message:String(a)}`)}}async function processAttachments(e,a){const{attachmentsDir:n,log:t}=a;if(!Array.isArray(e.message.content))return e;const s=await Promise.all(e.message.content.map(async e=>"image"===e.type&&"url"===e.source?.type&&e.source?.url?processImageBlock(e,t):"document"===e.type&&"url"===e.source?.type&&e.source?.url?processDocumentBlock(e,n,t):e));return{...e,message:{...e.message,content:s}}}async function processImageBlock(e,a){try{a?.("info","IMAGE",`Downloading image from: ${e.source.url}`);const n=await fetch(e.source.url);if(!n.ok)return a?.("error","IMAGE",`Failed to download image: ${n.statusText}`),e;const t=await n.arrayBuffer(),s=Buffer.from(t),i=s.toString("base64");let o=n.headers.get("content-type")||"image/jpeg";if(!o.startsWith("image/")){const a=e.source.url.toLowerCase();o=a.endsWith(".png")?"image/png":a.endsWith(".gif")?"image/gif":a.endsWith(".webp")?"image/webp":"image/jpeg"}return a?.("info","IMAGE",`Image downloaded and converted to base64 (${o}, ${Math.round(s.length/1024)}KB)`),{type:"image",source:{type:"base64",media_type:o,data:i}}}catch(n){return a?.("error","IMAGE",`Error processing image: ${n}`),e}}async function processDocumentBlock(e,a,n){try{const t=e.source.url;n?.("info","DOCUMENT",`Downloading document from: ${t}`);const{filePath:s,mimeType:i,filename:o}=await downloadFile(t,a,!0);return n?.("info","DOCUMENT",`Document downloaded to: ${s}`),{type:"text",text:`Document: ${s}\nTitle: ${e.title||o}\nType: ${i}`}}catch(a){return n?.("error","DOCUMENT",`Error processing document: ${a}`),e}}const system_sender={senderType:"system",senderId:"system",senderName:"system"};function createWorkerEventHandlers(e,a){return{"cancel-task":async a=>{a.taskId===e.taskId&&(_package.logger.info(`[WORKER] Task ${e.taskId} cancelled`),await e.stopTask())},"stop-task":async a=>{a.taskId===e.taskId&&(_package.logger.info(`[WORKER] Task ${e.taskId} stopped: ${a.reason||"no reason"}`),await e.stopTask())},"task-message":async n=>{if(n.taskId!==e.taskId)return;let t=n.message??null;if(!t&&n.encryptedMessage&&e.dataEncryptionKey&&(t=shared.decryptSdkMessage(n.encryptedMessage,e.dataEncryptionKey)??null),!t)return;const s={senderType:n.senderType,senderId:n.senderId,senderName:n.senderName};if(e.attachmentsDir&&shared.isSDKUserMessage(t)&&(t=await processAttachments(t,{attachmentsDir:e.attachmentsDir,log:e.logger})),e.shouldPersistTaskMessage&&!await e.shouldPersistTaskMessage(t,s))return void _package.logger.debug(`[WORKER] Dropping incoming task-message before persistence: eventId=${n.eventId}`);const i={...n,message:t,encryptedMessage:void 0,chatId:n.chatId??e.chatId};a.saveTaskEvent({eventType:"task-message",eventId:n.eventId,eventData:i,taskId:e.taskId,chatId:n.chatId??e.chatId,sequence:n.sequence??null}),a.saveMessage({eventId:n.eventId,message:t,senderType:n.senderType,senderId:n.senderId,senderName:n.senderName}),e.onTaskMessage&&await e.onTaskMessage(t,s)},"task-info-update":async a=>{a.taskId===e.taskId&&e.onTaskInfoUpdate&&await e.onTaskInfoUpdate(a)},"worker-status-request":async a=>{a.taskId===e.taskId&&e.onWorkerStatusRequest&&await e.onWorkerStatusRequest(a)},"sub-task-result-updated":async a=>{a.parentTaskId===e.taskId&&e.onSubTaskResultUpdated&&await e.onSubTaskResultUpdated(a)}}}class WorkerClient{client;context;historyDb;constructor(e,a){const{taskId:n,userId:t,machineId:s,cwd:i,chatId:o,...r}=e,c=i.endsWith("/")?i:`${i}/`;this.client=new SocketClient(r),this.context={taskId:n,chatId:o,userId:t,machineId:s,cwd:c,stopTask:a.stopTask,shouldPersistTaskMessage:a.shouldPersistTaskMessage,onTaskMessage:a.onTaskMessage,onTaskInfoUpdate:a.onTaskInfoUpdate,onWorkerStatusRequest:a.onWorkerStatusRequest,onSubTaskResultUpdated:a.onSubTaskResultUpdated,onGitPush:a.onGitPush,dataEncryptionKey:e.dataEncryptionKey},this.historyDb=a.historyDb,this.initHandlers()}connect(){return new Promise((e,a)=>{const n=setTimeout(()=>{a(new Error("Worker connection timeout after 10 seconds"))},1e4);this.client.onLifecycle("connect",()=>{clearTimeout(n),e()}),this.client.onLifecycle("connect_error",e=>{clearTimeout(n),a(e)}),this.client.connect()})}async disconnect(){this.client.connected&&await this.client.flush(5e3).catch(()=>{}),this.client.disconnect()}sendTaskMessage(e,a,n){const t=shared.createEventId();return this.historyDb.saveMessage({eventId:t,message:a,senderType:e.senderType,senderId:e.senderId,senderName:e.senderName}),this.sendTaskEvent(e,a,n),t}sendWorkerInitializing(){const e={eventId:shared.createEventId(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),cwd:this.context.cwd};this.client.send("worker-initializing",e)}sendWorkerInitialized(){const e={eventId:shared.createEventId(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),cwd:this.context.cwd};this.client.send("worker-initialized",e)}sendWorkerReady(e){const a={eventId:shared.createEventId(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),...void 0!==e&&{duration:e}};this.client.send("worker-ready",a)}sendWorkRunning(e){const a={eventId:shared.createEventId(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),activeAgents:e};this.client.send("worker-running",a)}sendWorkerExit(e){const a={eventId:shared.createEventId(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),reason:e};this.client.send("worker-exit",a)}async sendErrorMessageAndExit(e){this.sendSystemErrorMessage(e),await this.client.flush(2e3),this.sendWorkerExit("error"),await this.disconnect()}sendSystemErrorMessage(e,a){const n={type:"assistant",session_id:"",uuid:crypto.randomUUID(),parent_tool_use_id:null,message:{role:"assistant",content:[{type:"text",text:`System Error\n\n${e}`,metadata:{messageType:"system_error"}}]}};this.sendTaskEvent(system_sender,n,{groupId:a?.groupId})}sendAssistantMessage(e,a){const n={type:"assistant",session_id:"",uuid:crypto.randomUUID(),parent_tool_use_id:null,message:{role:"assistant",content:[{type:"text",text:e}]}};this.sendTaskEvent(system_sender,n,{groupId:a?.groupId})}sendAskUser(e,a,n){return this.sendTaskMessage(e,{type:"ask_user",questions:a},{replaceCwd:!1,groupId:n?.groupId})}sendAskUserResponse(e,a){return this.sendTaskMessage(system_sender,a,{replaceCwd:!1,opCode:e})}sendTaskEvent(e,a,n){const{eventId:t,replaceCwd:s=!0,opCode:i,artifacts:o}=n||{};let r=a;if(s){const e=this.context.cwd,n=e.slice(0,-1);let t=JSON.stringify(a);t=t.replaceAll(e,""),t=t.replaceAll(n,"."),r=JSON.parse(t)}const c=t??shared.createEventId(),p={eventId:c,taskId:this.context.taskId,chatId:this.context.chatId,from:"worker",messageType:r.type,message:r,encryptedMessage:void 0,opCode:i,groupId:n?.groupId,senderType:e.senderType,senderId:e.senderId,senderName:e.senderName,artifacts:o};if(this.historyDb.saveTaskEvent({eventType:"task-message",eventId:c,eventData:p,taskId:this.context.taskId,chatId:this.context.chatId,sequence:"number"==typeof p.sequence?p.sequence:null}),this.context.dataEncryptionKey){const e=shared.encryptSdkMessage(r,this.context.dataEncryptionKey);p.message=void 0,p.encryptedMessage=e}return this.client.send("task-message",p),c}sendUpdateTaskAgentSessionId(e){const a={eventId:shared.createEventId(),taskId:this.context.taskId,agentSessionId:e,cwd:this.context.cwd};this.client.send("update-task-agent-session-id",a)}sendChangeTaskTitle(e){const a={eventId:shared.createEventId(),taskId:this.context.taskId,title:e};this.client.send("change-task-title",a),_package.logger.info(`[AGENT] Title changed to: ${e}`)}sendUpdateAgentInfo(e,a){const n={eventId:shared.createEventId(),taskId:this.context.taskId,agentId:e,...a};this.client.send("update-agent-info",n),_package.logger.info(`[AGENT] Agent info updated: ${JSON.stringify(a)}`)}sendResetTaskSession(){const e={eventId:shared.createEventId(),taskId:this.context.taskId};this.client.send("reset-task-session",e),_package.logger.info(`[AGENT] Session reset requested for task ${this.context.taskId}`)}async sendMergeRequest(e,a){const n={eventId:shared.createEventId(),taskId:this.context.taskId,summary:e,description:a};_package.logger.info(`[MERGE] Sending merge-request event for task ${this.context.taskId}`);const t=await this.client.sendWithAck("merge-request",n);if(!t.success)throw new Error(`Failed to create pull request: ${t.error||"Unknown error"}`);return _package.logger.info(`[MERGE] Pull request created: #${t.data.pullRequestNumber}`),{pullRequestNumber:t.data.pullRequestNumber,pullRequestUrl:t.data.pullRequestUrl}}async sendMergePr(){const e={eventId:shared.createEventId(),taskId:this.context.taskId,mergeMethod:"squash"};return _package.logger.info(`[MERGE-PR] Sending merge-pr event for task ${this.context.taskId}`),await this.client.sendWithAck("merge-pr",e)}associateRepository(e,a,n,t){const s={eventId:shared.createEventId(),taskId:this.context.taskId,gitServerHost:e,owner:a,repo:n,remoteUrl:t};_package.logger.info(`[REPO] Sending repository association request: ${e}/${a}/${n}`),this.client.send("associate-repo",s)}async dispatchTaskMessage(e){await this.context.onTaskMessage(e)}initHandlers(){const e=createWorkerEventHandlers(this.context,this.historyDb);this.client.onEvent("cancel-task",e["cancel-task"]),this.client.onEvent("stop-task",e["stop-task"]),this.client.onEvent("task-message",e["task-message"]),this.client.onEvent("task-info-update",e["task-info-update"]),this.client.onEvent("worker-status-request",e["worker-status-request"]),this.client.onEvent("sub-task-result-updated",e["sub-task-result-updated"]),this.client.onEvent("event-ack",e=>{const a=e.data?.sequence;void 0!==e.opCode&&"number"==typeof a&&this.historyDb.updateTaskEventSequence(e.opCode,a)})}}class AgentContextImpl{logger;socketClient;taskId;userId;chatId;rootTaskId;parentTaskId;workingDirectory;taskAgents;serverUrl;constructor(e){this.logger=e.logger,this.socketClient=e.socketClient,this.taskId=e.taskId,this.userId=e.userId,this.chatId=e.chatId,this.rootTaskId=e.rootTaskId,this.parentTaskId=e.parentTaskId,this.workingDirectory=e.workingDirectory,this.taskAgents=e.taskAgents,this.serverUrl=e.serverUrl}async call(e,a,n){const t=shared.createEventId();try{const s=await this.socketClient.sendWithAck("rpc-call",{eventId:t,taskId:this.taskId,method:e,path:a,query:n?.query,body:n?.body});if(!s.success){const n=s.error||{code:"unknown",message:"Unknown error"};throw new Error(`RPC ${e} ${a} failed: ${n.message} (${n.code})`)}return s.data}catch(n){throw new Error(`RPC ${e} ${a} error: ${n.message}`)}}log(e){this.logger.info(e)}getWorkspace(){return this.workingDirectory}getUserId(){return this.userId}getTaskId(){return this.taskId}getChatId(){return this.chatId}getRootTaskId(){return this.rootTaskId}getParentTaskId(){return this.parentTaskId}getTaskAgents(){return this.taskAgents}async createDraftAgent(e){return this.call("POST","/v1/draft-agent",{body:{...e,userId:this.userId,taskId:this.taskId}})}async updateDraftAgent(e,a){return this.call("PATCH",`/v1/draft-agent/${e}`,{body:a})}async startSubTask(e){return{taskId:(await this.call("POST","/v1/tasks/start",{body:{userId:this.userId,chatId:this.chatId,agentId:e.agentId,message:e.message,parentTaskId:this.taskId,customTitle:e.title}})).taskId}}async startGroupTask(e){return{taskId:(await this.call("POST","/v1/tasks/start",{body:{userId:this.userId,chatId:this.chatId,message:e.message,parentTaskId:this.taskId,customTitle:e.title,todos:e.todos}})).taskId}}async sendMessage(e){await this.call("POST",`/v1/tasks/${e.taskId}/send-message`,{body:{message:e.message,target:e.target,fromTaskId:this.taskId,senderType:"agent",senderId:this.taskId,senderName:"agent"}})}async showModal(e){await this.call("POST",`/v1/tasks/${e.taskId}/show-modal`,{body:{modalName:e.modalName,modalData:e.modalData}})}async getTaskSession(e){return this.call("GET",`/v1/tasks/${e}/session`)}async findSubTaskByAgent(e){const a=await this.call("GET","/v1/tasks/find-by-agent",{query:{parentTaskId:this.taskId,agentId:e}});return a.taskId?{taskId:a.taskId}:null}async listSubTasks(){return(await this.call("GET","/v1/tasks/sub-tasks",{query:{parentTaskId:this.taskId}})).tasks}async listTasks(e){return(await this.call("GET","/v1/tasks/recent",{query:{chatId:this.chatId,...e?.limit&&{limit:e.limit},...e?.status&&{status:e.status}}})).tasks}async uploadFile(e){this.logger.info("[Agent-Context] Uploading file...");const a=await fs__namespace$1.promises.stat(e.path);this.logger.info("[Agent-Context] file stats");const n=a.size,t=e.contentType||mimeTypesExports.lookup(e.name)||"application/octet-stream",s=(await this.call("POST","/v1/files/upload-urls",{body:{count:1}})).files[0],i=s.url;this.logger.info(`[Agent-Context] FileUploadUrl: ${i}`);const o=await fs__namespace$1.promises.readFile(e.path),r=await fetch(i,{method:"PUT",headers:{"Content-Type":t},body:o});if(!r.ok)throw new Error(`Failed to upload file to S3: ${r.status} ${r.statusText}`);let c;return await this.call("POST","/v1/files/confirm-upload",{body:{fileId:s.id,name:e.name,size:n,contentType:t,visibility:e.visibility||"private"}}),c="public"===e.visibility?`${this.serverUrl}/v1/files/public/${s.id}`:i.split("?")[0],{fileId:s.id,name:e.name,size:n,contentType:t,url:c}}}function truncateToLines(e,a){const n=e.split("\n");return n.length<=a?e:n.slice(0,a).join("\n")+"..."}function buildSubTaskResultMessage(e,a){let n=e.resultMessage;if(0===n.result.trim().length&&e.encryptedResultMessage&&a){const t=shared.decryptSdkMessage(e.encryptedResultMessage,a);t&&"result"===t.type&&(n={type:"result",result:"result"in t?t.result:"",is_error:t.is_error})}const t={...e,resultMessage:{...n,result:truncateToLines(n.result,3)}};let s=`<sub-task-result-updated>\n${JSON.stringify(t,null,2)}\n</sub-task-result-updated>`;return s+=n.result.trim().length>0?'\n<system-reminder>The result is already shown to user as a card. Just acknowledge briefly (e.g., "Done!"). Only elaborate if error or needs user action.</system-reminder>':"\n<system-reminder>The sub-task result was empty. You can use reply_to_sub_task to ask it to continue, retry, or resend the result.</system-reminder>",{type:"user",message:{role:"user",content:s}}}function createMessageFilter(){const e=new Set;return{filter(a){const n=a;if(!n.message||!n.message.content||"string"==typeof n.message.content)return a;const t=n.message.content.filter(a=>!("tool_result"===a.type&&e.has(a.tool_use_id)||"user"===n.type&&"tool_result"!==a.type));return 0===t.length?null:(n.message.content=t,n)},clear(){e.clear()}}}function formatHistoryMessage(e){const a=buildHistoryMessageParts(e);return a?{type:"user",message:{role:"user",content:[{type:"text",text:`<msg ${buildAttributes({seq:a.seq.toString(),at:a.at,senderType:a.senderType??void 0,senderId:a.senderId??void 0,senderName:a.senderName??void 0})}>${a.text}</msg>\n`},...a.nonTextBlocks]},parent_tool_use_id:null,session_id:""}:null}function formatHistoryMessageXml(e){const a=buildHistoryMessageParts(e);return a?`<msg ${buildAttributes({seq:a.seq.toString(),at:a.at,senderType:a.senderType??void 0,senderId:a.senderId??void 0,senderName:a.senderName??void 0})}>\n${a.text}\n</msg>`:null}function buildAttributes(e){return Object.entries(e).filter(([,e])=>void 0!==e&&""!==e).map(([e,a])=>`${e}="${escapeXmlAttr(a)}"`).join(" ")}function escapeXmlAttr(e){return e.replaceAll("&","&amp;").replaceAll('"',"&quot;").replaceAll("<","&lt;").replaceAll(">","&gt;")}function formatHistoryXml(e){const a=[];for(const n of e){const e=formatHistoryMessageXml(n);e&&a.push(e)}return a.join("\n")}function formatAskUserMessage(e){return`Ask user: ${e.questions.map((e,a)=>{const n=e.options?.map(e=>e.label).filter(Boolean),t=n&&n.length>0?` options: ${n.join(", ")}`:"";return`Q${a+1}[${e.header}] ${e.question}${t}`}).join(" | ")}`}function formatAskUserResponse(e){return`Ask user response:${e.status?` status=${e.status}`:""}${e.reason?` reason=${e.reason}`:""} answers: ${e.answers?.length?e.answers.join(", "):"no answers"}`}function buildHistoryMessageParts(e){const{text:a,nonTextBlocks:n}=formatMessageParts(e.message);return a?{seq:e.localSequence,at:e.createdAt,senderType:e.senderType,senderId:e.senderId,senderName:e.senderName,text:a,nonTextBlocks:n}:null}function formatMessageParts(e){return shared.isAskUserMessage(e)?{text:formatAskUserMessage(e),nonTextBlocks:[]}:shared.isAskUserResponseMessage(e)?{text:formatAskUserResponse(e),nonTextBlocks:[]}:shared.isSDKMessage(e)?formatSdkMessageParts(e):{text:"",nonTextBlocks:[]}}function formatSdkMessageParts(e){switch(e.type){case"user":case"assistant":return splitContentBlocks(e.message.content);case"result":if("success"===e.subtype)return{text:e.result,nonTextBlocks:[]}}return{text:"",nonTextBlocks:[]}}function splitContentBlocks(e){if("string"==typeof e)return{text:e,nonTextBlocks:[]};if(Array.isArray(e)){const a=[],n=[];for(const t of e)"text"!==t.type||"string"!=typeof t.text?n.push(t):a.push(t.text);return{text:a.join("\n"),nonTextBlocks:n}}return{text:"",nonTextBlocks:[]}}function createAgentrixMcpTools(e){return{createTask:createTaskTool(e),createSoloTask:createSoloTaskTool(e),createGroupTask:createGroupTaskTool(e),replyToSubTask:createReplyToSubTaskTool(e),changeTaskTitle:createChangeTaskTitleTool(e),createPr:createPrTool(e),askUser:createAskUserTool(e),getTaskHistory:createGetTaskHistoryTool(e),getTaskAgents:createGetTaskAgentsTool(e),listSubTask:createListSubTaskTool(e),invoke:createInvokeTool(e),assign:createAssignTool(e),updateAgentInfo:createUpdateAgentInfoTool(e),sendReminder:createSendReminderTool(e),listTasks:createListTasksTool(e),readConversation:createReadConversationTool(e),uploadFile:createUploadFileTool(e)}}function createChangeTaskTitleTool({workClient:e}){return claudeAgentSdk.tool("change_title","Change the session title to better describe what you are working on.\n\n## When to Use\n- Call it at the start of a session to set a descriptive title\n- Call it again when the title becomes outdated or too generic\n\nGood titles help users find conversations later.",{title:zod.z.string().describe("New title for the task")},async a=>(e.sendChangeTaskTitle(a.title),{content:[{type:"text",text:`Task title updated to: ${a.title}`}]}))}function createReplyToSubTaskTool({agentContext:e,log:a}){return claudeAgentSdk.tool("emit_to_task","Send follow-up instructions to a running or failed sub-task.\nUse this when the sub-task needs clarification, hit an error, or the user has new requirements.",{taskId:zod.z.string().describe("Sub-task ID to send follow-up instructions to"),instructions:zod.z.string().describe("Additional instructions for the sub-task")},async n=>{try{return await e.sendMessage({taskId:n.taskId,message:{type:"user",message:{role:"user",content:n.instructions}},target:"agent"}),{content:[{type:"text",text:`Sent follow-up instructions to sub-task ${n.taskId}.`}]}}catch(e){return a("error","TASK",`Failed to send follow-up to sub-task ${n.taskId}:`,e),{content:[{type:"text",text:`Failed to send follow-up to sub-task: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function createGetTaskHistoryTool({historyDb:e}){return claudeAgentSdk.tool("get_task_history","Retrieve earlier task history stored locally for additional context.",{sequence:zod.z.number().int().describe("Return messages before this local sequence (exclusive)."),limit:zod.z.number().int().min(1).max(50).default(20).describe("Maximum number of messages to return.")},async a=>{const n=a.limit??20,t=e.pageMessagesBefore(a.sequence,n);return 0===t.data.length?{content:[{type:"text",text:"No earlier messages found."}]}:{content:[{type:"text",text:formatHistoryXml(t.data)}]}})}function createGetTaskAgentsTool({agentContext:e}){return claudeAgentSdk.tool("get_task_agents","List the agents available for the current task and return taskAgents info.",{},async()=>{const a=e.getTaskAgents();return a.length?{content:[{type:"text",text:JSON.stringify(a,null,2)}]}:{content:[{type:"text",text:"No task agents available."}]}})}function createListSubTaskTool({agentContext:e,log:a}){return claudeAgentSdk.tool("list_sub_task","List direct sub tasks for the current task with taskId, title, and cwd.",{},async()=>{try{const a=await e.listSubTasks();return a.length?{content:[{type:"text",text:JSON.stringify(a,null,2)}]}:{content:[{type:"text",text:"No sub tasks found."}]}}catch(e){return a("error","TASK","Failed to list sub tasks:",e),{content:[{type:"text",text:`Failed to list sub tasks: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function createTaskTool({agentContext:e,agentId:a,log:n}){return claudeAgentSdk.tool("create_task","Delegate a task to an agent for independent execution.\nAlways provide a concise task title in \"title\".\nThe task runs asynchronously - you'll be notified when complete via <sub-task-result-updated> message.\nUse for: multi-step implementations, analysis, code reviews, or any work that takes >30 seconds.\nAfter calling this tool, continue responding to user - don't wait for task completion.",{title:zod.z.string().min(1).max(200).describe("Task title for the agent to use (required)"),instructions:zod.z.string().describe("Detailed instructions for the agent. Be specific about what needs to be done."),briefSummary:zod.z.string().describe('One-line summary shown to user immediately (e.g., "Creating login page")')},async t=>{try{const s=await e.startSubTask({agentId:a,message:{type:"user",message:{role:"user",content:t.instructions}},customTitle:t.title});return n("info","TASK",`Created sub-task ${s.taskId} for agent ${a}`),{content:[{type:"text",text:`🚀 Task created: ${s.taskId}\nSummary: ${t.briefSummary}\n\nYou'll receive a <sub-task-result-updated> notification when the task completes. Continue responding to the user.`}]}}catch(e){return n("error","TASK","Failed to create sub-task:",e),{content:[{type:"text",text:`Failed to create task: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function createSoloTaskTool({agentContext:e,log:a}){return claudeAgentSdk.tool("create_solo_task","Create a single-agent async task in group chat.\n\n## When to Use (sparingly)\n- Long-running background work (>5 minutes)\n- Work that needs separate tracking/progress monitoring\n- Complex multi-step projects with explicit deliverables\n\n## Prefer invoke Instead\nFor most requests, use `invoke` - it's simpler and the agent responds directly in chat.\nOnly use this tool when background tracking is truly needed.\n\nAfter creating: You'll receive <sub-task-result-updated> when task completes.",{title:zod.z.string().min(1).max(200).describe("Task title"),instructions:zod.z.string().describe("Instructions for the owner agent"),briefSummary:zod.z.string().optional().describe("One-line summary shown to user immediately"),agentId:zod.z.string().describe("Target agent ID")},async n=>{try{return{content:[{type:"text",text:`🚀 Task created: ${(await e.startSubTask({agentId:n.agentId,message:{type:"user",message:{role:"user",content:n.instructions}},title:n.title})).taskId}\n${n.briefSummary?`Summary: ${n.briefSummary}\n`:""}\nYou'll receive a <sub-task-result-updated> notification when the task completes. Continue responding to the user.`}]}}catch(e){return a("error","TASK","Create solo task failed:",e),{content:[{type:"text",text:`Create solo task failed: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function createGroupTaskTool({agentContext:e,log:a,agentId:n}){return claudeAgentSdk.tool("create_group_task","Create a multi-agent async task plan in group chat.\n\n## When to Use (sparingly)\n- Long-running background work requiring multiple agents (>5 minutes)\n- Complex multi-step projects with explicit deliverables\n- Work that needs separate tracking/progress monitoring\n\n## Prefer invoke Instead\nFor most requests, use `invoke` - it's simpler and agents respond directly in chat.\nOnly use this tool when background tracking with multiple agents is truly needed.\n\nThe planner becomes the task owner; todos are embedded in the task.\nAfter creating: You'll receive <sub-task-result-updated> when task completes.",{title:zod.z.string().min(1).max(200).describe("Task title"),requirement:zod.z.string().describe("Overall requirement"),briefSummary:zod.z.string().optional().describe("One-line summary shown to user immediately"),todos:zod.z.array(zod.z.object({agentId:zod.z.string().describe("Agent ID responsible for the todo"),title:zod.z.string().min(1).max(200).describe("Todo title"),instructions:zod.z.string().describe("Detailed instructions for this todo")})).min(1).describe("Todo list for agents")},async n=>{try{return{content:[{type:"text",text:`🚀 Task created: ${(await e.startGroupTask({title:n.title,todos:n.todos,message:{type:"user",message:{role:"user",content:n.requirement}}})).taskId}\n${n.briefSummary?`Summary: ${n.briefSummary}\n`:""}\nYou'll receive a <sub-task-result-updated> notification when the task completes. Continue responding to the user.`}]}}catch(e){return a("error","DISPATCH","Dispatch failed:",e),{content:[{type:"text",text:`Dispatch failed: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function createPrTool({workClient:e,log:a,isMergeRequestActive:n,clearMergeRequest:t}){return claudeAgentSdk.tool("create_pr","Create a pull request with generated title and description. Use this tool after code has been pushed.",{title:zod.z.string().describe('PR title in conventional commits format (e.g., "feat: add new feature")'),description:zod.z.string().optional().describe("Detailed PR description explaining the changes")},async s=>{if(!n())return{content:[{type:"text",text:"No merge request in progress."}]};a("info","MERGE",`Creating PR via MCP: ${s.title}`);try{const a=await e.sendMergeRequest(s.title,s.description);return t(),{content:[{type:"text",text:`Pull request created successfully!\nNumber: #${a.pullRequestNumber}\nURL: ${a.pullRequestUrl}`}]}}catch(e){return a("error","MERGE","Failed to create PR:",e),{content:[{type:"text",text:`Failed to create pull request: ${e instanceof Error?e.message:"Unknown error"}`}]}}})}function createAskUserTool({askUser:e,log:a}){return claudeAgentSdk.tool("ask_user",'Ask the user questions when you need clarification or user input. Supports 1-4 questions with 2-4 options each. Use this when you need user decisions or additional information. An "Other" option with free text input is automatically added.',{questions:zod.z.array(zod.z.object({question:zod.z.string().describe("The complete question to ask the user"),header:zod.z.string().max(12).describe("Short label displayed as a chip/tag (max 12 chars)"),multiSelect:zod.z.boolean().describe("Set to true to allow multiple option selections"),options:zod.z.array(zod.z.object({label:zod.z.string().describe("Option label (1-5 words)"),description:zod.z.string().describe("Explanation of what this option means")})).min(2).max(4).describe("Available choices (2-4 options)")})).min(1).max(4).describe("Questions to ask (1-4 questions)")},async n=>{try{const a=n.questions.map(e=>({...e,options:[...e.options,{label:"Other",description:""}]})),t=await e(a);return"answered"!==(t.status??"answered")?{content:[{type:"text",text:"The user did not provide an answer within the expected time. \n<system-reminder>Please abort the session, and decide whether to retry when the user provides a new message later.</system-reminder>"}],isError:!0}:{content:[{type:"text",text:`User answers:\n${t.answers.map(e=>e.startsWith("other:")?`Other: "${e.slice(6)}"`:e).join("\n")}`}]}}catch(e){return a("error","ASK_USER","Failed to get user response:",e),{content:[{type:"text",text:`Failed to get user response: ${e instanceof Error?e.message:"Unknown error"}`}]}}})}function createInvokeTool({invokeAgent:e}){return claudeAgentSdk.tool("invoke",'Let an agent respond to the conversation (talk).\n\n**Use for**: Q&A, explanations, opinions, discussions, debates.\n**Do NOT use for**: Work producing files/code → use assign instead.\n\n**hint parameter**: Optional. Use to reduce agent\'s attention cost or provide meta-context:\n- ✅ Role assignment: hint="You argue FOR REST" (first turn of debate)\n- ✅ Focus guidance: hint="Focus on security aspects"\n- ✅ Long/busy chat: hint="Respond to Alice\'s caching question"\n- ✅ Multi-topic: hint="Re: the API design discussion"\n- ❌ Short, clear context: agent can easily find what to respond to\n\nAgent sees hint (if provided) + conversation history and responds in chat.',{agentId:zod.z.string().describe("Target agent ID"),hint:zod.z.string().optional().describe("Optional context/instruction for the agent")},async a=>(e(a.agentId,a.hint),{content:[{type:"text",text:`Invoked ${a.agentId}. The agent will respond in the chat later.`}]}))}function createUpdateAgentInfoTool({workClient:e,agentId:a,uploadFile:n,log:t}){return claudeAgentSdk.tool("update_agent_info","Update your display name, avatar, and signature in the platform.\nCall this after onboarding when the user has chosen your name and emoji/image.\nThis syncs your identity to the platform so the App displays your chosen name and avatar.\n\nFor avatar: provide a local image file path. The image will be uploaded to the platform.\nFor signature: a short status line or tagline shown under your name.",{displayName:zod.z.string().optional().describe("Your display name"),avatarPath:zod.z.string().optional().describe("Local path to avatar image file (png/jpg/svg)"),signature:zod.z.string().optional().describe("Short status line or tagline shown under your name")},async s=>{let i;if(s.avatarPath)try{i=(await n({name:"avatar.png",path:s.avatarPath,visibility:"public"})).fileId}catch(e){return t("error","TOOL","Avatar upload failed:",e),{content:[{type:"text",text:`Avatar upload failed: ${e}`}],isError:!0}}e.sendUpdateAgentInfo(a,{displayName:s.displayName,avatar:i,signature:s.signature});const o=[];return s.displayName&&o.push(`name → ${s.displayName}`),i&&o.push("avatar → uploaded"),s.signature&&o.push(`signature → ${s.signature}`),{content:[{type:"text",text:`Profile updated: ${o.join(", ")}`}]}})}function createAssignTool({assign:e,log:a}){return claudeAgentSdk.tool("assign","Assign work to an agent (do the work).\n\n**Use for**: Code, files, reports, artifacts (agent produces output).\n**Do NOT use for**: Q&A, explanations → use invoke instead.\n\nProgress streams to chat in real-time.",{agentId:zod.z.string().describe("Target agent ID"),instruction:zod.z.string().describe("Task instruction for the agent"),acknowledgment:zod.z.string().optional().describe('Agent\'s quick reply shown immediately (e.g., "starting now", "On it")')},async a=>(e(a.agentId,a.instruction,a.acknowledgment),{content:[{type:"text",text:`Assigned work to ${a.agentId}.`}]}))}function createListTasksTool({agentContext:e,log:a}){return claudeAgentSdk.tool("list_tasks","List recent tasks in the current chat.\nUse this to review what tasks have been running, completed, or are still active.\nReturns a lightweight summary of each task (id, title, state, agent, duration, timestamps).",{limit:zod.z.number().int().min(1).max(50).default(10).optional().describe("Maximum number of tasks to return (default 10)."),status:zod.z.enum(["all","active","completed"]).default("all").optional().describe("Filter by task status: all, active, or completed.")},async n=>{try{const a=await e.listTasks({limit:n.limit??10,status:n.status??"all"});return a.length?{content:[{type:"text",text:JSON.stringify(a,null,2)}]}:{content:[{type:"text",text:"No tasks found."}]}}catch(e){return a("error","TASK","Failed to list tasks:",e),{content:[{type:"text",text:`Failed to list tasks: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function createReadConversationTool({chatHistoryDb:e}){return claudeAgentSdk.tool("read_conversation","Read recent messages from the main conversation between you and the user. Use this to review what was discussed recently.",{limit:zod.z.number().int().min(1).max(200).default(50).optional().describe("Number of recent messages to return (default 50)."),before:zod.z.number().int().optional().describe("Sequence number — return messages before this sequence for pagination.")},async a=>{if(!e)return{content:[{type:"text",text:"Chat history not available in this mode."}],isError:!0};const n=a.limit??50,t=null!=a.before?e.pageMessagesBefore(a.before,n):e.pageRecentMessages(n);if(0===t.data.length)return{content:[{type:"text",text:"No conversation messages found."}]};let s=formatHistoryXml(t.data);return t.hasMore&&(s+=`\n\nMore messages available. Use before=${Math.min(...t.data.map(e=>e.localSequence))} to load earlier messages.`),{content:[{type:"text",text:s}]}})}function createSendReminderTool({agentContext:e,log:a}){return claudeAgentSdk.tool("send_reminder","Send an internal reminder to your main self (本体) in the primary chat.\nThis is for companion shadow (heartbeat task) use only.\n\nThe reminder is invisible to the user — it only wakes up the main companion worker.\nThe main companion will see the reminder in its conversation context and decide how to act.\n\nKeep content concise (one sentence). For detailed analysis, write to a file and pass filePath.",{content:zod.z.string().describe('Brief reminder message (one sentence, e.g., "Heartbeat architecture discussion pending for 2 days, consider following up")'),filePath:zod.z.string().optional().describe("Path to detailed analysis file in workspace, if any")},async n=>{try{const a=e.getChatId();return await e.sendMessage({taskId:a,message:{type:"companion_reminder",content:n.content,filePath:n.filePath,timestamp:(new Date).toISOString()},target:"agent"}),{content:[{type:"text",text:"Reminder sent to main companion."}]}}catch(e){return a("error","COMPANION","Failed to send reminder:",e),{content:[{type:"text",text:`Failed to send reminder: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function createUploadFileTool({uploadFile:e,log:a}){return claudeAgentSdk.tool("upload_file","Upload a local file to the platform and get a public URL.\nUse this to share images, documents, or other files with the user.\nReturns a public URL that can be embedded in markdown (e.g., ![screenshot](url)).",{filePath:zod.z.string().describe("Absolute path to the local file to upload"),name:zod.z.string().optional().describe("Display name for the file (defaults to filename)")},async n=>{try{const a=require("path"),t=n.name||a.basename(n.filePath);return{content:[{type:"text",text:(await e({name:t,path:n.filePath,visibility:"public"})).url}]}}catch(e){return a("error","TOOL","File upload failed:",e),{content:[{type:"text",text:`File upload failed: ${e}`}],isError:!0}}})}const execFileAsync=node_util.promisify(node_child_process.execFile);async function isGitRepository(e){try{const a=simpleGit(e);return await a.checkIsRepo()}catch{return!1}}async function listWorktrees(e){const a=simpleGit(e),n=(await a.raw(["worktree","list","--porcelain"])).trim().split("\n").filter(Boolean),t=[];let s=null;for(const e of n)if(e.startsWith("worktree "))s&&t.push(s),s={path:e.replace("worktree ","").trim(),branch:null,commit:"",isMain:0===t.length};else if(s)if(e.startsWith("HEAD "))s.commit=e.replace("HEAD ","").trim();else{if(e.startsWith("branch ")){const a=e.replace("branch ","").trim();s.branch=a.replace("refs/heads/","");continue}e.startsWith("detached")&&(s.branch=null)}return s&&t.push(s),t}async function createWorktree(e,a,n,t="HEAD"){const s=path$1.dirname(a);if(fs$1.existsSync(s)||fs$1.mkdirSync(s,{recursive:!0}),fs$1.existsSync(a)&&!isDirectoryEmpty(a))throw new Error(`Worktree directory already exists at ${a}`);const i=simpleGit(e);await i.raw(["worktree","add","-b",n,a,t])}async function removeWorktree(e,a,n=!1){const t=simpleGit(e),s=["worktree","remove"];n&&s.push("--force"),s.push(a),await t.raw(s)}async function setGitConfig(e,a,n){await execFileAsync("git",["config","user.name",a],{cwd:e}),await execFileAsync("git",["config","user.email",n],{cwd:e})}async function gitInit(e){const a=simpleGit(e);await a.init()}async function initialCommit(e){const a=simpleGit(e);await a.add("."),await a.commit("Initial commit",{"--allow-empty":null})}async function gitClone(e,a){const n=path$1.dirname(a);fs$1.existsSync(n)||fs$1.mkdirSync(n,{recursive:!0});const t=simpleGit();await t.clone(e,a)}async function ensureTaskBranch(e,a,n){const t=simpleGit(e);(await t.branchLocal()).all.includes(a)?await t.checkout(a):(n&&await t.checkout(n),await t.checkoutLocalBranch(a))}async function hasUncommittedChanges(e){const a=simpleGit(e);return!(await a.status()).isClean()}async function gitStash(e,a){const n=simpleGit(e);await n.stash(["push"])}async function getCurrentCommitHash(e){const a=simpleGit(e),n=await a.log({maxCount:1});if(!n.latest)throw new Error("No commits found in repository");return n.latest.hash}async function hasAnyCommits(e){try{const a=simpleGit(e);return null!==(await a.log({maxCount:1})).latest}catch{return!1}}function isDirectoryEmpty(e){if(!fs$1.existsSync(e))return!0;const a=fs$1.readdirSync(e);return 0===a.length||1===a.length&&".git"===a[0]}async function autoCommit(e,a){const n=simpleGit(e);return await n.add("."),await n.commit(a),await getCurrentCommitHash(e)}async function generateDiffPatch(e,a,n){const t=simpleGit(e);return await t.diff([`${a}..${n}`])}async function getDiffStats(e,a,n){const t=simpleGit(e),s=await t.diffSummary([`${a}..${n}`]);return{totalInsertions:s.insertions,totalDeletions:s.deletions,files:s.files.map(e=>({path:e.file,insertions:"insertions"in e?e.insertions:0,deletions:"deletions"in e?e.deletions:0}))}}async function getCurrentBranch(e){const a=simpleGit(e);return(await a.revparse(["--abbrev-ref","HEAD"])).trim()}async function gitPush(e,a,n=!1){const t=simpleGit(e),s=n?["--force"]:[];await t.push("origin",a,s)}async function hasUnpushedCommits(e,a){const n=simpleGit(e);try{return(await n.log([`origin/${a}..HEAD`])).total>0}catch{return!0}}async function updateRemoteUrl(e,a,n){const t=simpleGit(e);await t.remote(["set-url",a,n])}async function getRemoteInfo(e){try{const a=simpleGit(e),n=(await a.getRemotes(!0)).find(e=>"origin"===e.name);if(!n?.refs?.fetch)return null;const t=n.refs.fetch,s=t.match(/^git@([^:]+):(.+)\/(.+?)(?:\.git)?$/);if(s){const[,e,a,n]=s;return{url:t,host:e.split("-")[0],owner:a,repo:n}}const i=t.match(/^https?:\/\/([^/]+)\/(.+)\/(.+?)(?:\.git)?$/);if(i){const[,e,a,n]=i;return{url:t,host:e,owner:a,repo:n}}return null}catch(e){return console.error("[GIT] Failed to get remote info:",e),null}}const DEFAULT_GIT_HTTP_USERNAME="oauth2",ASKPASS_USERNAME_ENV="AGENTRIX_GIT_USERNAME",ASKPASS_PASSWORD_ENV="AGENTRIX_GIT_PASSWORD";function createAskPassScript(){const e=path$1.join(os.tmpdir(),`git-askpass-${node_crypto.randomUUID()}.sh`);return fs$1.writeFileSync(e,`#!/bin/sh\ncase "$1" in\n *Username*|*username*) printf '%s\\n' "\${${ASKPASS_USERNAME_ENV}:-oauth2}" ;;\n *) printf '%s\\n' "\${${ASKPASS_PASSWORD_ENV}:-}" ;;\nesac\n`,{mode:448}),e}function askPassEnv(e,a,n="oauth2"){return{...process.env,GIT_ASKPASS:e,GIT_TERMINAL_PROMPT:"0",[ASKPASS_USERNAME_ENV]:n,[ASKPASS_PASSWORD_ENV]:a}}async function cloneWithAskPass(e,a,n){const t=path$1.dirname(n);fs$1.existsSync(t)||fs$1.mkdirSync(t,{recursive:!0});const s=createAskPassScript();try{await execFileAsync("git",["clone",a,n],{env:askPassEnv(s,e)})}finally{fs$1.unlinkSync(s)}}async function pushWithAskPass(e,a,n,t=!1){const s=createAskPassScript();try{const i=["push","origin",n];t&&i.push("--force"),await execFileAsync("git",i,{cwd:a,env:askPassEnv(s,e)})}finally{fs$1.unlinkSync(s)}}async function fetchWithAskPass(e,a){const n=createAskPassScript();try{await execFileAsync("git",["fetch","origin"],{cwd:a,env:askPassEnv(n,e)})}finally{fs$1.unlinkSync(n)}}async function checkUncommittedChanges(e){return!!await isGitRepository(e)&&await hasUncommittedChanges(e)}async function handleUncommittedChanges(e,a){switch(a){case"Ignore":console.log("[GIT] User chose to ignore uncommitted changes");break;case"Commit":console.log("[GIT] Auto-committing uncommitted changes"),await autoCommit(e,"WIP: Auto-commit before task");break;case"Stash":console.log("[GIT] Stashing uncommitted changes"),await gitStash(e);break;case"Abort":throw new Error("Task aborted by user due to uncommitted changes")}}function buildWorkspaceOptions(e){return{gitUrl:e.gitUrl,baseBranch:e.baseBranch,cwd:e.cwd||"",userCwd:e.userCwd,forceUserCwd:e.forceUserCwd,userId:e.userId,taskId:e.taskId,repositorySourceType:e.repositorySourceType,taskRepositoryId:e.repositoryId,gitServerId:e.gitServerId}}function createTaskBranchName(e){return`agentrix/${e}`}function buildRepositoryInitInput(e,a){return{hook_event_name:"RepositoryInit",workspace_path:e,task_id:a}}async function tryLoadPat(e){if(!e)return null;const a=await _package.machine.getSecretKey();return a?loadPat(e,a):null}async function configureGitIdentity(e,a){const n=loadPatMeta(a);if(!n)return void console.warn("[GIT] No PAT user metadata found, skipping git config");const t=n.username,s=n.email||`${n.username}@gitlab.local`;await setGitConfig(e,t,s),console.log(`[GIT] Set local git config user.name=${t} user.email=${s}`)}async function setupGitRepository(e,a,n,t,s){const i=createTaskBranchName(n),o=await isGitRepository(e);if(!isDirectoryEmpty(e)&&!o)throw new Error(`Directory ${e} exists but is not a git repository`);const r=await tryLoadPat(s);return isDirectoryEmpty(e)?(r?(console.log("[GIT] Using GIT_ASKPASS credential injection for clone"),await cloneWithAskPass(r,a,e),s&&await configureGitIdentity(e,s)):await gitClone(a,e),await ensureTaskBranch(e,i,t),await getCurrentCommitHash(e)):(await updateRemoteUrl(e,"origin",a),r&&(console.log("[GIT] Using GIT_ASKPASS credential injection for fetch"),await fetchWithAskPass(r,e),s&&await configureGitIdentity(e,s)),await ensureTaskBranch(e,i,t),await getCurrentCommitHash(e))}async function pushForTask(e,a,n,t){const s=await tryLoadPat(t);s?await pushWithAskPass(s,e,a,n):await gitPush(e,a,n)}async function initializeGitRepository(e,a,n){await gitInit(e);const t=buildRepositoryInitInput(e,a);return n?.onRepositoryInit&&await n.onRepositoryInit(t),await initialCommit(e),await getCurrentCommitHash(e)}async function tryAssociateRepository(e,a){try{const n=await getRemoteInfo(e);if(!n)return void console.log("[REPO] No origin remote found, skipping repository association");if(!a?.onRepositoryDetected)return;console.log(`[REPO] Detected remote: ${n.host}/${n.owner}/${n.repo}`),a.onRepositoryDetected(n)}catch(e){console.error("[REPO] Failed to send repository association:",e)}}async function setupTmpRepoWorkspace(e,a,n){return{initialCommitHash:await initializeGitRepository(e,a,n)}}async function setupWorktreeWorkspace(e,a,n){const t=e.replace(/^~/,os.homedir());if(!await isGitRepository(t))throw new Error(`Directory ${t} is not a git repository. Worktrees can only be created from existing git repositories.`);if(!await hasAnyCommits(t))throw new Error(`Cannot create worktree: repository at ${t} has no commits. Please create an initial commit first: cd ${t} && git add . && git commit -m 'Initial commit'`);const s=createTaskBranchName(n),i=(await listWorktrees(t)).find(e=>e.path===a);if(i){if(i.branch&&i.branch!==s)throw new Error(`Worktree at ${a} is already attached to branch ${i.branch}. Remove it before retrying: git worktree remove ${a}`);return{initialCommitHash:await getCurrentCommitHash(a)}}const o=simpleGit(t),r=(await o.branchLocal()).all.includes(s);if(fs$1.existsSync(a)&&!isDirectoryEmpty(a))throw new Error(`Worktree directory already exists at ${a}. This may be from a previous task. To clean up: git worktree remove ${a} OR rm -rf ${a}`);try{r?await o.raw(["worktree","add",a,s]):await createWorktree(t,a,s,"HEAD")}catch(e){try{await removeWorktree(t,a,!0)}catch{}throw e}return{initialCommitHash:await getCurrentCommitHash(a)}}function createAutoCommitMessage(e,a){return`Auto-commit: ${e} at ${(new Date).toISOString().replace("T"," ").substring(0,19)} for task ${a}`}async function generateAndSavePatch(e,a,n,t){if(a===n)return;const s=await generateDiffPatch(e,a,n);if(!s.trim())return;const i=path$1.join(t,"patch.diff");return await promises$1.writeFile(i,s),i}async function saveTaskPatchDiff(e,a,n,t,s){return generateAndSavePatch(e,t,s,_package.machine.resolveDataDir(a,n))}async function handleGitState(e,a,n,t,s,i={}){if(!await isGitRepository(e))return{currentCommitHash:"",hadUncommittedChanges:!1,hasNewCommits:!1,lastSentCommitHash:void 0,patchPath:"",diffStats:void 0};const o=await hasUncommittedChanges(e),r=o,c=i.autoCommitOnDirty??!0;o&&c&&await autoCommit(e,t);const p=await getCurrentCommitHash(e),l=s||_package.machine.getWorkspaceState(a,n)?.initialCommitHash;if(!l)throw new Error(`Initial commit hash not found for task ${n}`);const d=await _package.machine.readLastSentCommitHash(a,n),u=p!==(d??l),m=_package.machine.resolveDataDir(a,n);return{currentCommitHash:p,hadUncommittedChanges:r,hasNewCommits:u,lastSentCommitHash:d??void 0,patchPath:await generateAndSavePatch(e,l,p,m),diffStats:await getDiffStats(e,l,p)}}async function handleGitStateOnWorkerStart(e,a,n,t,s={}){return handleGitState(e,a,n,createAutoCommitMessage("recover from previous session",n),t,s)}async function markCommitAsSent(e,a,n){await _package.machine.writeLastSentCommitHash(e,a,n)}function applyTemplateVariables(e,a){return e.replace(/\{\{initialCommitHash\}\}/g,a.initialCommitHash).replace(/\{\{currentCommitHash\}\}/g,a.currentCommitHash).replace(/\{\{branchName\}\}/g,a.branchName)}function applyPRPromptTemplate(e,a){return applyTemplateVariables(e,a)}function buildPRRequestPrompt(e,a){return`Please generate pull request metadata for the changes made in this task.\n\nInitial commit hash: ${e}\n${a?`\n\nAdditional instructions:\n${a}`:""}\n\nProvide a concise title (conventional commits format), a detailed description, and a user-facing summary message.`}function executeCommandStreaming(e,a,n,t=6e4){return new Promise(s=>{const i=`shell_${crypto$1.randomUUID().replace(/-/g,"")}`;n.onOutput({type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:i,name:"shell",input:{command:e}}]},parent_tool_use_id:null,session_id:""});const o=child_process.spawn("/bin/bash",["-c",e],{cwd:a,env:process.env,shell:!1});let r=null,c=!1;t>0&&(r=setTimeout(()=>{c=!0,o.kill("SIGTERM"),setTimeout(()=>{o.killed||o.kill("SIGKILL")},1e3)},t));let p="";o.stdout?.on("data",e=>{p+=e.toString()}),o.stderr?.on("data",e=>{p+=e.toString()}),o.on("close",(e,a)=>{let o,l,d;if(r&&clearTimeout(r),c){o=124,d=!0;const e=`\n[Command timed out after ${t/1e3} seconds]`;l=p?`${p}${e}`:e.trim()}else o=null!==e?e:"SIGTERM"===a?143:1,d=0!==o,l=p||"(no output)";n.onOutput({type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:i,content:l,is_error:d}]},parent_tool_use_id:null,session_id:""}),n.onComplete(o),s(o)}),o.on("error",e=>{r&&clearTimeout(r);const a=`[Error] ${e.message||"Command execution failed"}`;n.onOutput({type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:i,content:a,is_error:!0}]},parent_tool_use_id:null,session_id:""}),n.onComplete(1),s(1)})})}class Coordinator{config;messageQueue=[];agentMessageQueue=[];agentMessageResolver=null;workerState="running";messageIdCounter=0;isStopped=!1;runStartTime=Date.now();commandRunning=!1;isDebouncing=!1;agentRunningMap=new Map;backgroundTaskMap=new Map;anonymousBackgroundTaskCount=0;lastActiveAgentsSignature=null;idleTimeoutHandle=null;idleTimeoutMs;constructor(e){this.config=e,this.idleTimeoutMs=Math.max(0,e.idleTimeoutMs??0)}parseMessage(e){if("user"!==e.type)return{type:"normal",content:"",originalMessage:e};const a=("string"==typeof e.message.content?e.message.content:"").trim();return a.startsWith("!")&&!a.startsWith("![")?{type:"bash-command",content:a.slice(1).trim(),originalMessage:e}:"![merge-request]"===a?{type:"merge-request",content:a,originalMessage:e}:"![merge-pr]"===a?{type:"merge-pr",content:a,originalMessage:e}:"![new]"===a?{type:"new-session",content:a,originalMessage:e}:{type:"normal",content:a,originalMessage:e}}async enqueue(e){if(this.isStopped)return void this.log("warn","COORDINATOR","Ignoring message - coordinator is stopped");if(!("user"!==e.type||e.message&&"object"==typeof e.message&&"content"in e.message))return void this.log("warn","COORDINATOR","Ignoring malformed user message (missing content)");const a=this.parseMessage(e),n={id:"msg-"+ ++this.messageIdCounter,type:a.type,priority:"normal",content:a.content,originalMessage:e,timestamp:Date.now()};this.messageQueue.push(n),this.log("info","COORDINATOR",`Enqueued message ${n.id} (type: ${n.type}, queue: ${this.messageQueue.length})`),this.tryUpdateWorkerState(),this.tryProcessNext()}async tryProcessNext(){if(!this.isStopped&&0!==this.messageQueue.length){this.tryUpdateWorkerState();try{const e=this.messageQueue.shift();this.log("info","COORDINATOR",`Processing message ${e.id} (type: ${e.type})`),await this.processMessage(e),this.log("info","COORDINATOR",`Completed message ${e.id}`)}catch(e){this.log("error","COORDINATOR",`Error processing message: ${e}`)}finally{this.isStopped||this.tryProcessNext()}}}async processMessage(e){try{switch(e.type){case"normal":await this.processNormalMessage(e);break;case"bash-command":await this.processBashCommand(e);break;case"merge-request":await this.processMergeRequest(e);break;case"merge-pr":await this.processMergePr(e);break;case"new-session":await this.processNewSession(e);break;default:this.log("warn","COORDINATOR",`Unknown message type: ${e.type}`)}}finally{if("normal"!==e.type){const a=e.originalMessage.__localSequence;void 0!==a&&this.config.onCommandMessageProcessed?.(a)}}}async processNormalMessage(e){this.log("info","COORDINATOR","Processing normal message for SDK");const a=await this.config.handlers.onNormalMessage(e.originalMessage);this.enqueueAgentMessage(a)}async processBashCommand(e){this.log("info","COORDINATOR",`Processing bash command: ${e.content}`),await this.waitWorkerIdle(),this.setCommandRunning(!0);try{await this.config.handlers.onBashCommand(e.content,e.originalMessage)}finally{this.setCommandRunning(!1)}}async processMergeRequest(e){this.log("info","COORDINATOR","Processing merge-request command"),await this.waitWorkerIdle(),this.setCommandRunning(!0);try{await this.config.handlers.onMergeRequest(e.originalMessage)}finally{this.setCommandRunning(!1)}}async processMergePr(e){this.log("info","COORDINATOR","Processing merge-pr command"),await this.waitWorkerIdle(),this.setCommandRunning(!0);try{await this.config.handlers.onMergePr()}finally{this.setCommandRunning(!1)}}async processNewSession(e){this.log("info","COORDINATOR","Processing new-session command"),await this.waitWorkerIdle(),this.setCommandRunning(!0);try{await(this.config.handlers.onNewSession?.())}finally{this.setCommandRunning(!1)}}async waitWorkerIdle(){for(;"idle"!==this.getExecutionState();){if(this.isStopped)throw new Error("Coordinator stopped while waiting for idle");this.log("debug","COORDINATOR","Waiting for worker idle state"),await new Promise(e=>setTimeout(e,100))}}setWorkerState(e){if(this.workerState===e)return;const a=this.workerState;if(this.log("info","COORDINATOR",`Worker state: ${a} → ${e}`),this.workerState=e,"running"===e&&"idle"===a&&(this.runStartTime=Date.now(),this.config.workClient.sendWorkRunning(this.getActiveAgents()),this.lastActiveAgentsSignature=this.getActiveAgentsSignature(),this.clearIdleTimer()),"idle"===e&&"running"===a){let e;this.runStartTime&&(e=Date.now()-this.runStartTime,this.runStartTime=null),this.config.workClient.sendWorkerReady(e),this.lastActiveAgentsSignature=null,this.startIdleTimer()}}updateAgentRunning(e){this.setAgentRunning("default","Agent",e)}setAgentRunning(e,a,n){const t="running"===this.workerState,s=this.lastActiveAgentsSignature;n?this.agentRunningMap.set(e,{agentId:e,agentName:a,startedAt:Date.now()}):this.agentRunningMap.delete(e);const i=this.getActiveAgentsSignature();this.lastActiveAgentsSignature=i,this.tryUpdateWorkerState(),t&&"running"===this.workerState&&i!==s&&this.config.workClient.sendWorkRunning(this.getActiveAgents())}setBackgroundTaskRunning(e,a){e&&(a?this.backgroundTaskMap.set(e,{taskId:e,startedAt:Date.now()}):!this.backgroundTaskMap.delete(e)&&this.anonymousBackgroundTaskCount>0&&(this.anonymousBackgroundTaskCount-=1,this.log("debug","COORDINATOR",`Background task ${e} completed via anonymous fallback (remaining: ${this.anonymousBackgroundTaskCount})`)),this.tryUpdateWorkerState())}setAnonymousBackgroundTaskRunning(e){e?(this.anonymousBackgroundTaskCount+=1,this.log("debug","COORDINATOR",`Anonymous background task started (count: ${this.anonymousBackgroundTaskCount})`)):this.anonymousBackgroundTaskCount>0&&(this.anonymousBackgroundTaskCount-=1,this.log("debug","COORDINATOR",`Anonymous background task completed (count: ${this.anonymousBackgroundTaskCount})`)),this.tryUpdateWorkerState()}getActiveAgents(){return Array.from(this.agentRunningMap.values()).map(({agentId:e,agentName:a})=>({agentId:e,agentName:a}))}getActiveAgentsSignature(){const e=this.getActiveAgents().slice().sort((e,a)=>e.agentId.localeCompare(a.agentId));return JSON.stringify(e)}enqueueAgentMessage(e){if(this.isStopped)this.log("warn","COORDINATOR","Ignoring agent message - coordinator is stopped");else if(this.agentMessageQueue.push(e),this.agentMessageResolver){const e=this.agentMessageResolver;this.agentMessageResolver=null,e(this.agentMessageQueue.shift())}}hasAgentMessages(){return this.agentMessageQueue.length>0}getAgentQueueLength(){return this.agentMessageQueue.length}async waitForAgentMessage(){return this.isStopped?null:this.agentMessageQueue.length>0?this.agentMessageQueue.shift():new Promise(e=>{this.agentMessageResolver=e})}cancelAgentWait(){if(!this.agentMessageResolver)return;const e=this.agentMessageResolver;this.agentMessageResolver=null,e(null)}setCommandRunning(e){this.commandRunning!==e&&(this.commandRunning=e,this.tryUpdateWorkerState())}hasExecutionWork(){return this.commandRunning||this.agentRunningMap.size>0||this.backgroundTaskMap.size>0||this.anonymousBackgroundTaskCount>0||this.isDebouncing}getExecutionState(){return this.hasExecutionWork()?"running":"idle"}setDebouncing(e){this.isDebouncing!==e&&(this.isDebouncing=e,this.tryUpdateWorkerState())}tryUpdateWorkerState(){if(this.isStopped)return;const e=this.messageQueue.length>0||this.agentMessageQueue.length>0,a=this.hasExecutionWork(),n=!e&&!a;this.setWorkerState(n?"idle":"running")}startIdleTimer(){0!==this.idleTimeoutMs&&(this.idleTimeoutHandle||(this.idleTimeoutHandle=setTimeout(()=>{this.idleTimeoutHandle=null,this.isStopped||(this.log("info","COORDINATOR","Idle timeout reached, stopping task"),this.cancelAgentWait(),this.config.onIdleTimeout?.())},this.idleTimeoutMs)))}clearIdleTimer(){this.idleTimeoutHandle&&(clearTimeout(this.idleTimeoutHandle),this.idleTimeoutHandle=null)}getStatus(){return{state:this.workerState}}isActivelyExecuting(){return this.hasExecutionWork()}stop(){this.log("info","COORDINATOR","Stopping coordinator"),this.isStopped=!0,this.clearIdleTimer(),this.messageQueue=[],this.agentMessageQueue=[],this.backgroundTaskMap.clear(),this.anonymousBackgroundTaskCount=0,this.cancelAgentWait()}log(e,a,n){this.config.logger&&this.config.logger(e,a,n)}}function sendMessage(e,a){const n={type:"assistant",session_id:"",uuid:crypto.randomUUID(),parent_tool_use_id:null,message:{role:"assistant",content:[{type:"text",text:a}]}};e.sendTaskMessage(system_sender,n)}async function executeMergePr(e){const{workingDirectory:a,workClient:n,repositoryId:t,gitServerId:s,logger:i,askUser:o}=e;if(i.info("[MERGE-PR] Executing merge-pr command"),t){try{const e=await getCurrentBranch(a),t=await hasUncommittedChanges(a),r=await hasUnpushedCommits(a,e);if(t||r){const c=await askMergePrAction(t,r,o,i);if("Pause"===c)return void sendMessage(n,"Operation paused. Please handle git state and run merge again.");if(("Push"===c||"PushAndMerge"===c)&&(t&&(i.info("[MERGE-PR] Auto-committing changes"),await autoCommit(a,"Auto-commit before merge")),i.info(`[MERGE-PR] Pushing branch ${e} to remote`),await pushForTask(a,e,!1,s),"Push"===c))return void sendMessage(n,"✅ All changes pushed to remote. You can now review and run merge again if everything looks good.")}const c=await n.sendMergePr();if(c.success)sendMessage(n,`✅ PR merged successfully! Branch ${e} has been merged into the target branch.`);else{let e;switch(c.errorType){case"github_conflict":e="Merge conflict detected. Please resolve conflicts manually on GitHub and try again.";break;case"pr_not_open":e="PR is not open. The PR may have already been merged or closed.";break;case"permission_denied":e="Permission denied. You may not have permission to merge this PR.";break;case"merge_failed":e=`Merge failed: ${c.error||"Unknown error"}`;break;default:e=`Failed to merge PR: ${c.error||"Unknown error"}`}n.sendSystemErrorMessage(e)}}catch(e){i.error("[MERGE-PR] Failed:",e);const a=e instanceof Error?e.message:"Unknown error";n.sendSystemErrorMessage(`Failed to push or merge: ${a}`)}i.info("[MERGE-PR] Worker ready after merge-pr execution")}else n.sendSystemErrorMessage("Cannot merge: task has no git repository configured.")}async function askMergePrAction(e,a,n,t){let s="";s=e&&a?"You have uncommitted changes and unpushed commits. What would you like to do?":e?"You have uncommitted changes. What would you like to do?":"You have unpushed commits. What would you like to do?";const i=[{question:s,header:"Git Status",multiSelect:!1,options:[{label:"Pause",description:"Stop operation, handle git state manually"},{label:"Push",description:"Push changes and review before merging"},{label:"Push and Merge",description:"Push changes and merge PR immediately"}]}];try{const e=(await n(i)).answers[0];return e.startsWith("other:")?(t.info(`[MERGE-PR] User provided custom input: ${e}, defaulting to Pause`),"Pause"):{Pause:"Pause",Push:"Push","Push and Merge":"PushAndMerge"}[e]||"Pause"}catch(e){return t.error("[MERGE-PR] Ask user failed:",e),"Pause"}}function applyTaskInfoUpdate(e,a){const n=e.updates?.repositoryId;return"string"==typeof n&&0!==n.length&&a.repositoryId!==n&&(a.repositoryId=n,_package.machine.writeTaskInput(a),!0)}function normalizeAskUserResponse(e){const a=e.status??"answered";return e.status&&e.reason?e:{...e,status:a,reason:e.reason??("timeout"===a?"timeout":"user")}}function askUserWithTimeout(e,a,n,t={}){const s=n.sendAskUser(e),i=t.timeoutMs??18e5,o=t.onTimeout;return new Promise((e,t)=>{const r=setTimeout(()=>{a.delete(s);const i={type:"ask_user_response",answers:[],status:"timeout",reason:"timeout"};n.sendAskUserResponse(s,i),"abort_task"===o?(n.onTimeoutMessage?.("ask_user timed out. Task cancelled."),n.stopTask?.("ask_user_timeout"),t(new Error("Ask user request timed out"))):e(i)},i);a.set(s,a=>{clearTimeout(r),e(normalizeAskUserResponse(a))})})}function trimIdent(e){const a=e.split("\n");for(;a.length>0&&""===a[0].trim();)a.shift();for(;a.length>0&&""===a[a.length-1].trim();)a.pop();const n=a.reduce((e,a)=>{if(""===a.trim())return e;const n=a.match(/^\s*/)[0].length;return Math.min(e,n)},1/0);return a.map(e=>e.slice(n)).join("\n")}const CHANGE_TITLE_PROMPT=trimIdent("\n ## Title Setting Protocol:\n - MUST set a descriptive title using mcp__agentrix__change_title as your FIRST action when the user makes a request\n - This is mandatory, not optional - do this before any other work\n - Update the title if the conversation direction changes substantially\n"),GROUP_CHAT_MESSAGE_FORMAT=trimIdent('\n ## Input Data Format (Conversation Stream)\n\n Messages come in this XML format. Pay attention to `seq` to understand the order.\n\n <msg seq="N" at="ISO_TIME" senderType="human|agent" senderId="id" senderName="name">\n content\n </msg>\n'),ORCHESTRATION_DECISION_FRAMEWORK=trimIdent('\n ## Orchestration Decision Framework\n\n **Core Principle**: Analyze dependencies FIRST to choose orchestration mode.\n\n **Decision Rule**:\n - **No dependencies** (agents work independently) → Direct execution\n - **Has dependencies** (sequential, turn-taking, coordination) → Plan-Execute-Replan loop\n\n ### Mode 1: Direct Execution (No Dependencies)\n\n When agents can work independently with no coordination:\n - Single agent request\n - Parallel opinions (no need to build on each other)\n - Independent work tasks\n\n **Examples**:\n - "Claude, explain X" → invoke(claude)\n - "What do you both think?" → invoke(claude), invoke(codex)\n - "Claude, write parser. Codex, write formatter." → assign both\n\n ### Mode 2: Plan-Execute-Replan Loop (Has Dependencies)\n\n When work has sequential dependencies or coordination:\n\n **The Loop**:\n 1. **PLAN**: TodoWrite defines structure/order\n 2. **EXECUTE**: invoke/assign first agent\n 3. **WAIT**: Agent responds in next message batch\n 4. **REPLAN**: Update TODO (mark done), identify next\n 5. **REPEAT**: Continue until complete\n\n **Dependency types**:\n - **Sequential**: Agent B needs Agent A\'s output\n - **Turn-taking**: Debate/conversation structure (A→B→A)\n - **Coordination**: Multiple agents with defined roles\n\n **Example - Debate** (turn-taking dependency):\n ```\n User: "4-round debate on REST vs GraphQL"\n\n PLAN (TodoWrite):\n - [ ] Claude: Opening argument FOR REST\n - [ ] Codex: Counter argument FOR GraphQL\n - [ ] Claude: Rebuttal\n - [ ] Codex: Final response\n\n EXECUTE: invoke(claude, hint="You argue FOR REST. Present your opening argument.")\n WAIT: Claude responds with REST argument\n REPLAN: Mark done, next is codex\n EXECUTE: invoke(codex, hint="You argue FOR GraphQL. Counter the REST arguments.")\n WAIT: Codex responds with GraphQL argument\n REPLAN: Mark done, next is claude rebuttal\n EXECUTE: invoke(claude) // No hint needed - role already established from history\n REPEAT...\n ```\n\n **hint usage**: Use hint to reduce agent\'s attention cost or provide meta-context:\n - ✅ Role assignment: first turn of debate (hint="You argue FOR REST")\n - ✅ Focus guidance: (hint="Focus only on performance aspects")\n - ✅ Long/busy chat: help agent locate relevant context (hint="Respond to Alice\'s question about caching")\n - ✅ Multi-topic: clarify which thread to address (hint="Re: the API design discussion")\n - ❌ Short, clear context: agent can easily find what to respond to\n - ❌ Role already established: agent knows their role from recent history\n\n **Why TodoWrite**: Planner is event-driven, can\'t "wait" for responses. TodoWrite provides persistent state across turns.\n\n ### Best Practices\n\n - Match agent to user intent by reviewing capabilities (get_task_agents)\n - Review history (get_task_history) when context is unclear\n\n ### Common Mistakes\n\n - ❌ Invoke just because an agent spoke; only act on unmet user requests\n - ❌ Repeated or cascading invokes on the same request\n - ❌ Invoke multiple agents with dependencies simultaneously\n - ❌ Use TodoWrite for independent requests (over-engineering)\n - ❌ Forget to update TODO after agent responds\n'),GROUP_CHAT_PLANNER_IDENTITY=trimIdent('\n You are Planner, orchestrating a chat group where Users and Agents interact.\n Your goal is to observe the conversation stream, analyze context, and direct appropriate agents via tools.\n\n ## Visibility Rules\n\n - Your text output is NOT shown to users, but IS visible to developers for debugging\n - Keep brief reasoning/analysis in your output to help developers understand your decisions\n - NEVER attempt to answer user questions directly - let agents handle all user interaction\n\n ## Output Format\n\n 1. Brief reasoning (for developer debugging)\n 2. Tool calls if needed\n 3. Final output: ONLY "✅" on a new line (no other text after it)\n'),CHAT_MODE_TASK_DELEGATION=trimIdent("\n # Task Delegation\n\n ## When to Delegate (use create_task)\n\n - Implementation work: writing code, editing files, running tests\n - Investigation: multi-file analysis, tracing bugs, code archaeology\n - Code reviews, audits, or quality scans\n - Producing artifacts: reports, plans, configs\n - Any work where the user is waiting for you to finish before the conversation can continue\n\n ## When to Respond Directly\n\n - Answering questions, explaining concepts\n - Quick file lookups to answer a specific question (1-2 reads is fine)\n - Short code snippets or examples in conversation\n - Discussion, planning, decision-making with the user\n\n ## Your Role in Conversation\n\n The conversation is for **discussion, decisions, and summaries** — not for executing work.\n\n - Discuss approaches, trade-offs, and options with the user\n - Make decisions together (or present recommendations)\n - Summarize task results when they come back\n - Coordinate and plan — then delegate execution to tasks\n\n ## Anti-Patterns (Do NOT do these in conversation)\n\n - ❌ **Code editing**: Don't write/edit code directly in conversation — create a task\n - ❌ **Research rabbit holes**: Don't grep → read → grep → read in conversation — delegate the investigation\n - ❌ **Building artifacts**: Any output that produces files (code, reports, configs) belongs in a task\n - ❌ **Running tests/builds**: Don't run test suites or build commands in conversation — create a task\n\n **Rule of thumb**: If you're about to *change* something or *produce* something, it's a task. If you're about to *answer* something, respond directly.\n\n ## After Delegating\n\n - User sees task creation confirmation immediately\n - Continue responding to user's other questions\n - You'll receive <sub-task-result-updated> when task completes\n - Briefly summarize the result to user — no deep analysis needed\n - Do NOT create duplicate sub-tasks unless explicitly asked\n\n ## Using emit_to_task Effectively\n\n emit_to_task sends follow-up instructions to a running or completed sub-task. Use it for:\n\n - **User adds requirements**: User says \"also add tests\" → emit to the existing task, don't create a new one\n - **Passing decisions**: You discussed options with user, user chose option B → emit the decision to the task\n - **Course correction**: Task went in wrong direction → emit new guidance\n - **Providing context**: Task asks a question → get answer from user → emit answer to task\n - **Retry after failure**: Task failed → emit instructions to retry with fixes\n\n Do NOT use emit_to_task to:\n - Start a completely different task (create a new task instead)\n - Send very long instructions (if the scope changed drastically, create a new task)\n\n ## Task Granularity\n\n - **One task = one coherent unit of work** (e.g., \"implement login page\", \"investigate memory leak\")\n - Don't create a task for a single trivial operation (e.g., \"read one file\")\n - Don't cram unrelated work into one task — split them so they can run in parallel\n - Multiple independent tasks CAN run in parallel\n"),PLANNER_BASE_PROMPT=trimIdent(`\n ${GROUP_CHAT_PLANNER_IDENTITY}\n\n ${GROUP_CHAT_MESSAGE_FORMAT}\n\n ${ORCHESTRATION_DECISION_FRAMEWORK}\n`),GROUP_MEMBER_MESSAGE_FORMAT=trimIdent('\n ## Message Format\n\n Messages in this group chat are formatted as XML:\n\n <msg seq="N" at="ISO_TIME" senderType="human|agent" senderId="id" senderName="name">\n content\n </msg>\n\n You may also receive a `<hint>` block at the start:\n\n <hint>\n context or instruction from the orchestrator\n </hint>\n\n The hint provides context for your response (e.g., debate role, focus area).\n Follow the hint\'s guidance while responding to the conversation.\n\n When responding, just reply naturally - the system will handle formatting.\n');function buildAgentsListPrompt(e){const a=["# Available Agents",""];for(const n of e)n.description?a.push(`- **${n.name}** (${n.id}): ${n.description}`):a.push(`- **${n.name}** (${n.id})`);return a.join("\n")}function buildAgentContextPrompt(e,a){const n=a.find(a=>a.id===e);if(!n)return buildAgentsListPrompt(a);const t=a.filter(a=>a.id!==e),s=["# Group Context","",`You are \`${n.name}\`. `,"You are a member of this group chat."];if(n.description&&s.push(`Your role: ${n.description}`),t.length>0){s.push(""),s.push("## Other Agents in This Group"),s.push("");for(const e of t)e.description?s.push(`- **${e.name}**: ${e.description}`):s.push(`- **${e.name}**`)}return s.push(""),s.push(GROUP_MEMBER_MESSAGE_FORMAT),s.join("\n")}function mergeEnvironment(e){const a={};for(const[n,t]of Object.entries(e))"string"==typeof t&&(a[n]=t);return a}function isTextBlock(e){if("object"!=typeof e||null===e)return!1;const a=e;return"text"===a.type&&"string"==typeof a.text}function normalizeClaudeUserMessage(e){return{type:"user",message:{role:"user",content:e},parent_tool_use_id:null,session_id:""}}function extractUserMessageText(e){const a=e.message?.content;return"string"==typeof a?a:Array.isArray(a)?a.filter(isTextBlock).map(e=>e.text).join("\n").trim():""}function createClaudeAssistantMessage(e){return{type:"assistant",session_id:"",uuid:crypto.randomUUID(),parent_tool_use_id:null,message:{role:"assistant",content:[{type:"text",text:e}]}}}function createSdkResultMessage(e){const a=e.usage.input_tokens-e.usage.cached_input_tokens,n={input_tokens:e.usage.input_tokens,output_tokens:e.usage.output_tokens,cache_creation:{ephemeral_1h_input_tokens:0,ephemeral_5m_input_tokens:0},cache_creation_input_tokens:0,cache_read_input_tokens:e.usage.cached_input_tokens,server_tool_use:{web_fetch_requests:0,web_search_requests:0},service_tier:"standard"};return{type:"result",subtype:"success",duration_ms:0,duration_api_ms:0,is_error:!1,num_turns:e.numTurns,result:e.result??"",stop_reason:null,total_cost_usd:0,usage:n,modelUsage:{[e.model]:{inputTokens:a>0?a:0,outputTokens:e.usage.output_tokens,cacheReadInputTokens:e.usage.cached_input_tokens,cacheCreationInputTokens:0,webSearchRequests:0,costUSD:0,contextWindow:0,maxOutputTokens:0}},permission_denials:[],uuid:crypto.randomUUID(),session_id:e.sessionId}}const HOOK_TIMEOUT_MS=6e4;async function executeHook(e,a,n,t){if(!e)return;const s=e[a];if(!s)return;const i=t||(e=>console.log(e));try{i(`[${a}] Executing hook...`);const e=new AbortController,t=setTimeout(()=>{e.abort()},6e4);try{await s(n,"",{signal:e.signal}),i(`[${a}] Hook executed successfully`)}finally{clearTimeout(t)}}catch(e){console.warn(`[${a}] Hook failed (non-fatal):`,e)}}function buildHooksWithDelegation(e,a){const n={},t=e=>async(a,n,t)=>await e(a,n,t)??{},s=new Set([...Object.keys(e),...a?Object.keys(a):[]]);for(const i of s){const s=[],o=e[i];o&&s.push(t(o));const r=a?.[i];r&&s.push(t(r)),n[i]=[{hooks:s}]}return n}const DEFAULT_SERVER_NAME="agentrix",DEFAULT_SERVER_VERSION="1.0.0",formatToolName=(e,a)=>`mcp__${e}__${a}`;function buildAgentrixMcpServer(e){const{modeConfig:a,tools:n,serverName:t=DEFAULT_SERVER_NAME,serverVersion:s=DEFAULT_SERVER_VERSION}=e,{mode:i,supportChangeTitle:o}=a,r=[];switch(i){case"work":o&&r.push(n.changeTaskTitle),r.push(n.createPr),r.push(n.askUser),r.push(n.getTaskHistory);break;case"chat":r.push(n.createTask),r.push(n.replyToSubTask),r.push(n.askUser),r.push(n.getTaskHistory),r.push(n.listSubTask);break;case"group_chat":r.push(n.invoke),r.push(n.createSoloTask),r.push(n.createGroupTask),r.push(n.replyToSubTask),r.push(n.getTaskAgents),r.push(n.getTaskHistory);break;case"group_work":r.push(n.invoke),r.push(n.assign),o&&r.push(n.changeTaskTitle),r.push(n.createPr),r.push(n.getTaskAgents),r.push(n.getTaskHistory);break;case"reply":r.push(n.getTaskHistory),r.push(n.askUser);break;case"companion_chat":r.push(n.createTask),r.push(n.askUser),r.push(n.getTaskHistory),r.push(n.uploadFile);break;case"companion_shadow":r.push(n.getTaskHistory),r.push(n.readConversation)}return("companion_chat"===i||"companion_shadow"===i)&&(r.push(n.listTasks),r.push(n.updateAgentInfo),r.push(n.sendReminder)),{server:claudeAgentSdk.createSdkMcpServer({name:t,version:s,tools:r}),toolNames:r.map(e=>formatToolName(t,e.name))}}async function*oneShotPrompt(e){yield e}let claudePathOverrideCache;function resolveBinaryPath(e){const a="win32"===process.platform?"where":"which",n=node_child_process.spawnSync(a,[e],{encoding:"utf-8"});if(0===n.status)return n.stdout.split(/\r?\n/).map(e=>e.trim()).find(e=>e.length>0)}function normalizeClaudePath(e){const a=e.trim();if(a){if(a.includes("/")||a.includes("\\")||a.startsWith(".")){const e=path$1.isAbsolute(a)?a:path$1.resolve(a);return fs$1.existsSync(e)?e:void 0}return resolveBinaryPath(a)}}function resolveClaudePathOverride(){if(void 0!==claudePathOverrideCache)return claudePathOverrideCache??void 0;const e=process.env.AGENTRIX_CLAUDE_PATH?.trim();if(e){const a=normalizeClaudePath(e);if(a)return claudePathOverrideCache=a,a}claudePathOverrideCache=null}const CHAT_TOOLS=["Bash","Glob","Grep","ExitPlanMode","Read","Skill","SlashCommand","EnterPlanMode"],GROUP_REPLY_TOOLS=["Glob","Grep","Read","Skill"],GROUP_CHAT_TOOLS=["Read","Glob","Grep"],GROUP_WORK_TOOLS=["Read","Glob","Grep","TodoWrite"];function buildSdkTools(e){switch(e){case"work":case"companion_shadow":return;case"chat":case"companion_chat":return[...CHAT_TOOLS];case"reply":return[...GROUP_REPLY_TOOLS];case"group_chat":return[...GROUP_CHAT_TOOLS];case"group_work":return[...GROUP_WORK_TOOLS]}}function getModePrompt(e){const{mode:a,supportChangeTitle:n}=e;switch(a){case"work":return n?CHANGE_TITLE_PROMPT:void 0;case"companion_shadow":case"companion_chat":case"reply":case"group_chat":return;case"chat":return CHAT_MODE_TASK_DELEGATION;case"group_work":{const e=[];return n&&e.push(CHANGE_TITLE_PROMPT),e.join("\n\n")}}}function buildSystemPrompt(e){const{agentId:a,modeConfig:n,cwd:t,agentConfig:s}=e,{mode:i,groupAgents:o}=n,r=s.customSystemPrompt,c=s.systemPromptMode??"append",p=getModePrompt(n);if("group_chat"===i||"group_work"===i){const e=[PLANNER_BASE_PROMPT];return o&&o.length>0&&e.push(buildAgentsListPrompt(o)),p&&e.push(p),e.join("\n\n")}const l="reply"===i&&o&&o.length>0?buildAgentContextPrompt(a,o):void 0,d={},u=process.env.AGENTRIX_COMPANION_HOME||process.env.AGENTRIX_COMPANION_WORKSPACE;u&&(d.COMPANION_HOME=u,d.COMPANION_MODE="companion_shadow"===i?"shadow":"chat");const m=Object.keys(d).length>0?d:void 0,g=r?shared.replacePromptPlaceholders(r,t,m):void 0;if("replace"===c&&g){const e=[g];return l&&e.push(l),p&&e.push(p),e.join("\n\n")}const h=[];return l&&h.push(l),p&&h.push(p),g&&h.push(g),{type:"preset",preset:"claude_code",append:h.length>0?h.join("\n\n"):void 0}}function buildQueryOptions(e,a,n,t,s,i,o){const r=buildSystemPrompt({agentId:e,modeConfig:a.modeConfig,cwd:a.cwd,agentConfig:n}),c=buildSdkTools(a.modeConfig.mode),p=buildHooksWithDelegation(a.hooks??{},t),l=resolveClaudePathOverride(),d=i?buildAgentrixMcpServer({modeConfig:a.modeConfig,tools:i}):void 0,u={...d?.server?{agentrix:d.server}:{},...a.mcpServers??{},...s??{}};return{stderr:a.stderr,model:n.customModel||a.model,fallbackModel:n.customFallbackModel,cwd:a.cwd,resume:a.agentSessionId,permissionMode:n.customPermissionMode||"bypassPermissions",settingSources:["user","project","local"],systemPrompt:r,tools:c,mcpServers:u,plugins:n.customPlugins,abortController:a.abortController,env:a.env?mergeEnvironment(a.env):void 0,pathToClaudeCodeExecutable:l,maxTurns:n.customMaxTurns??a.maxTurns??o,extraArgs:n.customExtraArgs,canUseTool:a.canUseTool,hooks:p,outputFormat:a.structuredOutputSchema}}class ClaudeRunner{constructor(e,a,n,t){this.agentId=e,this.agentConfig=a,this.agentHooks=n,this.agentMcpServers=t}getAgentConfiguration(){return this.agentConfig}getHooks(){return this.agentHooks}getMcpServers(){return this.agentMcpServers}async executeHook(e,a,n){await executeHook(this.agentHooks,e,a,n)}async run(e,a){const n=this.agentConfig,t="string"==typeof e?normalizeClaudeUserMessage(e):e;let s=null;const i=claudeAgentSdk.query({prompt:oneShotPrompt(t),options:buildQueryOptions(this.agentId,a,n,this.agentHooks,this.agentMcpServers,a.agentrixTools)});for await(const e of i)if(console.log("ClaudeRunner.run: received message",JSON.stringify(e)),"result"===e.type){s=e;break}if(!s)throw new Error("ClaudeRunner.run: missing result message");return s}async*runStreamed(e,a){const n=this.agentConfig,t="string"==typeof e?normalizeClaudeUserMessage(e):e,s=claudeAgentSdk.query({prompt:oneShotPrompt(t),options:buildQueryOptions(this.agentId,a,n,this.agentHooks,this.agentMcpServers,a.agentrixTools)});for await(const e of s)if(yield e,"result"===e.type)break}loop(e){const a=e.abortController,n=this.agentConfig,t=buildQueryOptions(this.agentId,e,n,this.agentHooks,this.agentMcpServers,e.agentrixTools);let s=!1;const i=[];let o=null;const r=()=>{if(!s&&(s=!0,o)){const e=o;o=null,e(null)}},c=async function*(){for(;!s&&!a.signal.aborted;){if(i.length>0){yield i.shift();continue}const e=await new Promise(e=>{o=e});if(!e)break;yield e}},p=async function*(){try{const e=claudeAgentSdk.query({prompt:c(),options:t});for await(const a of e)yield a}finally{r()}}();return a.signal.addEventListener("abort",r,{once:!0}),{push:e=>{if(console.log("ClaudeRunner.loop.push:",JSON.stringify(e,null,2)),s)return;const a="string"==typeof e?normalizeClaudeUserMessage(e):e;if(o){const e=o;return o=null,void e(a)}i.push(a)},events:p}}}function createSyntheticInitMessage(e){return{type:"system",subtype:"init",apiKeySource:"temporary",betas:[],claude_code_version:"codex",cwd:e.cwd,tools:[],mcp_servers:[],model:e.model??"unknown",permissionMode:"default",slash_commands:[],output_style:"codex",skills:[],plugins:[],uuid:node_crypto.randomUUID(),session_id:e.sessionId}}function generateAndMapToolId(e,a){const n=node_crypto.randomUUID();return a.set(e,n),n}function getMappedToolId(e,a){return a.get(e)||e}function convertThreadEventToSDKMessage(e,a){return"thread.started"===e.type||"turn.started"===e.type||"turn.completed"===e.type||"turn.failed"===e.type?null:"item.started"===e.type?convertItemStarted(e.item,a):"item.completed"===e.type?convertItemCompleted(e.item,a):null}function convertItemStarted(e,a){switch(e.type){case"command_execution":return convertCommandExecutionStarted(e,a);case"file_change":return convertFileChangeStarted(e,a);case"mcp_tool_call":return convertMcpToolCallStarted(e,a);case"web_search":return convertWebSearchStarted(e,a);default:return null}}function convertItemCompleted(e,a){switch(e.type){case"agent_message":return convertAgentMessage(e);case"reasoning":default:return null;case"command_execution":return convertCommandExecutionCompleted(e,a);case"file_change":return convertFileChangeCompleted(e,a);case"mcp_tool_call":return convertMcpToolCallCompleted(e,a);case"web_search":return convertWebSearchCompleted(e,a);case"todo_list":return convertTodoList(e);case"error":return convertError(e)}}function convertAgentMessage(e){return{type:"assistant",message:{id:e.id,type:"message",container:null,role:"assistant",content:[{citations:null,type:"text",text:e.text}],model:"",usage:{},stop_reason:null,context_management:null,stop_sequence:null},parent_tool_use_id:null,session_id:"",uuid:node_crypto.randomUUID().toString()}}function convertCommandExecutionStarted(e,a){return{type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:generateAndMapToolId(e.id,a),name:"Bash",input:{command:e.command}}]},parent_tool_use_id:null,session_id:""}}function convertCommandExecutionCompleted(e,a){return{type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:getMappedToolId(e.id,a),content:"failed"===e.status?"Command execution failed":e.aggregated_output||""}]},parent_tool_use_id:null,session_id:""}}function convertFileChangeStarted(e,a){return{type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:generateAndMapToolId(e.id,a),name:"Edit",input:{changes:e.changes.map(e=>({kind:e.kind,path:e.path}))}}]},parent_tool_use_id:null,session_id:""}}function convertFileChangeCompleted(e,a){const n=a.get(e.id),t=n??generateAndMapToolId(e.id,a),s=!n;(e.changes||[]).map(e=>`${e.kind}: ${e.path}`);const i={type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:t,name:"Edit",input:{changes:(e.changes||[]).map(e=>({kind:e.kind,path:e.path}))}}]},parent_tool_use_id:null,session_id:""},o={type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:t,content:"failed"===e.status?"File changes failed":"File changes completed"}]},parent_tool_use_id:null,session_id:""};return s?[i,o]:o}function convertMcpToolCallStarted(e,a){return{type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:generateAndMapToolId(e.id,a),server_name:e.server,name:e.tool,input:e.arguments}]},parent_tool_use_id:null,session_id:""}}function convertMcpToolCallCompleted(e,a){const n=getMappedToolId(e.id,a),t="failed"===e.status&&e.error;return{type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:n,is_error:t,content:t?e.error.message:e.result?.content||""}]},parent_tool_use_id:null,session_id:""}}function convertWebSearchStarted(e,a){return{type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:generateAndMapToolId(e.id,a),name:"web_search",input:{query:e.query}}]},parent_tool_use_id:null,session_id:""}}function convertWebSearchCompleted(e,a){return{type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:getMappedToolId(e.id,a),content:{type:"web_search_result",results:[]}}]},parent_tool_use_id:null,session_id:""}}function convertTodoList(e){return{type:"assistant",message:{role:"assistant",content:`📋 Todo List:\n${e.items.map(e=>`${e.completed?"✓":"○"} ${e.text}`).join("\n")}`},parent_tool_use_id:null,session_id:""}}function convertError(e){return{type:"assistant",message:{role:"assistant",content:`❌ Error: ${e.message}`},parent_tool_use_id:null,session_id:""}}let codexPathOverrideCache;function resolveCodexPathOverride(){if(void 0!==codexPathOverrideCache)return codexPathOverrideCache??void 0;const e=process.env.AGENTRIX_CODEX_PATH?.trim();return e?(codexPathOverrideCache=e,e):0===node_child_process.spawnSync("codex",["--version"],{stdio:"ignore"}).status?(codexPathOverrideCache="codex",codexPathOverrideCache):void(codexPathOverrideCache=null)}class CodexRunner{createCodex(e){const a={},n=resolveCodexPathOverride();return n&&(a.codexPathOverride=n),e.env&&(a.env=mergeEnvironment(e.env)),new codexSdk.Codex(Object.keys(a).length>0?a:void 0)}getAgentConfiguration(){return null}getHooks(){}getMcpServers(){}async executeHook(e,a,n){}async run(e,a){const n=a.abortController,t=this.createCodex(a),s={workingDirectory:a.cwd,model:a.model,sandboxMode:"danger-full-access",approvalPolicy:"never",skipGitRepoCheck:!0},i=a.agentSessionId?t.resumeThread(a.agentSessionId,s):t.startThread(s),o=await i.run("string"==typeof e?e:extractUserMessageText(e),{signal:n.signal,outputSchema:a.structuredOutputSchema?.schema||void 0}),r=i.id??a.agentSessionId??"unknown",c=o.usage??{input_tokens:0,cached_input_tokens:0,output_tokens:0};return createSdkResultMessage({sessionId:r,model:a.model??"unknown",numTurns:1,usage:c,result:o.finalResponse??""})}async*runStreamed(e,a){const n=a.abortController,t=this.createCodex(a),s={workingDirectory:a.cwd,model:a.model,sandboxMode:"danger-full-access",approvalPolicy:"never",skipGitRepoCheck:!0},i=a.agentSessionId?t.resumeThread(a.agentSessionId,s):t.startThread(s),{events:o}=await i.runStreamed("string"==typeof e?e:extractUserMessageText(e),{signal:n.signal,outputSchema:a.structuredOutputSchema?.schema||void 0});let r=a.agentSessionId||"",c="",p={input_tokens:0,cached_input_tokens:0,output_tokens:0};const l=new Map,d={get:e=>l.get(e),set:(e,a)=>{l.set(e,a)}};for await(const e of o){if("thread.started"===e.type&&(r=e.thread_id,yield createSyntheticInitMessage({sessionId:r,cwd:a.cwd,model:a.model})),"turn.completed"===e.type){e.usage&&(p=e.usage);break}if("turn.failed"===e.type)throw new Error(e.error.message);if("error"===e.type)throw new Error(e.message);if("item.completed"===e.type&&"agent_message"===e.item.type&&e.item.text&&(c=e.item.text),"item.started"===e.type||"item.completed"===e.type){const a=convertThreadEventToSDKMessage(e,d);if(!a)continue;const n=Array.isArray(a)?a:[a];for(const e of n)yield e}}const u=createSdkResultMessage({sessionId:r,model:a.model??"unknown",numTurns:1,usage:p,result:c});yield u}loop(e){const a=e.abortController,n=this.createCodex(e),t={workingDirectory:e.cwd,model:e.model,sandboxMode:"danger-full-access",approvalPolicy:"never",skipGitRepoCheck:!0};let s=e.agentSessionId?n.resumeThread(e.agentSessionId,t):n.startThread(t),i=!1;const o=[];let r=null,c=e.agentSessionId??null,p=0;const l=()=>{if(!i&&(i=!0,r)){const e=r;r=null,e(null)}},d=e=>"string"==typeof e?e:extractUserMessageText(e),u=async function*(){try{for(;!i&&!a.signal.aborted;){const n=o.length>0?o.shift():await new Promise(e=>{r=e});if(!n)break;let t="";const l=new Map,u={get:e=>l.get(e),set:(e,a)=>{l.set(e,a)}},{events:m}=await s.runStreamed(d(n),{signal:a.signal,outputSchema:e.structuredOutputSchema?.schema||void 0});for await(const a of m){if(i)break;if("thread.started"!==a.type){if("turn.completed"===a.type){c&&(yield createSdkResultMessage({sessionId:c,model:e.model??"unknown",numTurns:p+1,usage:a.usage??{input_tokens:0,cached_input_tokens:0,output_tokens:0},result:t}));break}if("turn.failed"===a.type)throw new Error(a.error.message);if("error"===a.type)throw new Error(a.message);if("item.started"===a.type||"item.completed"===a.type){"item.completed"===a.type&&"agent_message"===a.item.type&&a.item.text&&(t=a.item.text);const e=convertThreadEventToSDKMessage(a,u);if(!e)continue;const n=Array.isArray(e)?e:[e];for(const e of n)yield e}}else c=a.thread_id,yield createSyntheticInitMessage({sessionId:c,cwd:e.cwd,model:e.model})}p+=1}}finally{l()}}();return a.signal.addEventListener("abort",l,{once:!0}),{push:e=>{if(console.log("CodexRunner.loop.push:",JSON.stringify(e,null,2)),!i){if(r){const a=r;return r=null,void a(e)}o.push(e)}},events:u}}}function log(e,a,n){e&&e(a,"AGENT",n)}function createDefaultClaudeAgentConfiguration(){return{customSystemPrompt:void 0,customModel:void 0,customFallbackModel:void 0,customMaxTurns:void 0,customExtraArgs:void 0,customPermissionMode:void 0,customPlugins:[],systemPromptMode:"append",customPRPromptTemplate:void 0,prPromptMode:"append",customSdkMcpTools:void 0}}async function loadClaudeAgentConfiguration(e){const{agentId:a,agentDir:n,logger:t}=e;if(!a||"default"===a)return createDefaultClaudeAgentConfiguration();try{log(t,"info",`Loading agent: ${a}`);const e=await shared.loadAgentConfig({agentId:a,framework:"claude",agentDir:n});if(!e.claude)return log(t,"warn",`No claude configuration found for agent ${a}`),createDefaultClaudeAgentConfiguration();const s=e.claude,i=s.plugins.map(e=>({type:"local",path:e})),o=n||shared.getAgentContext().resolveAgentDir(a),r=s.config.sdkMcpTools?.map(e=>path$1.join(o,"claude",e)),c={customSystemPrompt:s.systemPrompt,customModel:s.config.model,customFallbackModel:s.config.fallbackModel,customMaxTurns:s.config.maxTurns,customExtraArgs:s.config.extraArgs,customPermissionMode:s.config.settings?.permissionMode,customPlugins:i,systemPromptMode:s.config.systemPrompt?.mode??"append",customPRPromptTemplate:s.prPromptTemplate,prPromptMode:s.config.pullRequestPrompt?.mode??"append",customSdkMcpTools:r};return log(t,"info",`Agent ${a} loaded successfully (${i.length} plugins)`),c}catch{return log(t,"error",`Failed to load agent: ${a}`),createDefaultClaudeAgentConfiguration()}}const VALID_HOOK_NAMES=["PreToolUse","PostToolUse","SessionStart","SessionEnd","UserPromptSubmit","Stop","SubagentStop","PreCompact","Notification","RepositoryInit"];async function loadHooks(e,a){const n=path.join(e,"hooks");if(!fs.existsSync(n))return{};const t=[path.join(n,"dist","index.mjs"),path.join(n,"dist","index.js"),path.join(n,"index.mjs"),path.join(n,"index.js")];let s=null;for(const e of t)if(fs.existsSync(e)){s=e;break}if(!s)return console.warn(`[Hook Loader] Hooks not built: ${n}`),console.warn("[Hook Loader] To build hooks, run:"),console.warn(`[Hook Loader] cd ${n}`),console.warn("[Hook Loader] npm install && npm run build"),console.warn("[Hook Loader] Or place hooks directly in:"),console.warn(`[Hook Loader] ${path.join(n,"index.js")} or ${path.join(n,"index.mjs")}`),{};try{console.log(`[Hook Loader] Loading hooks: ${s}`);const e=`${url.pathToFileURL(s).href}?t=${Date.now()}`,n=await import(e);if("function"==typeof n.default){if(a)return console.log("[Hook Loader] Using factory pattern with AgentrixContext"),extractHooks(n.default(a));console.warn("[Hook Loader] Factory function found but no context provided, skipping factory")}return extractHooks(n)}catch(e){throw console.error(`[Hook Loader] Failed to load hooks from ${s}:`,e),new Error(`Hook loading failed: ${e instanceof Error?e.message:String(e)}`)}}function extractHooks(e){const a={};for(const n of VALID_HOOK_NAMES){const t=e[n];"function"==typeof t&&(a[n]=t,console.log(`[Hook Loader] ✓ Loaded hook: ${n}`))}const n=Object.keys(a).length;return 0===n?console.warn("[Hook Loader] No valid hooks found in module"):console.log(`[Hook Loader] Successfully loaded ${n} hook(s)`),a}async function loadAgentHooks(e,a,n){if(e&&"default"!==e)try{const t=shared.getAgentContext(),s=a||t.resolveAgentDir(e),i=path$1.join(s,"claude");return await loadHooks(i,n)}catch(e){return void console.warn("[AgentRunners] Failed to load hooks:",e)}}async function loadSdkMcpTools(e,a,n){const t={};for(const s of e)try{n&&n("info","MCP",`Loading SDK MCP tools from: ${s}`);const e=await import(s),i=e.default||e;if(!i){n&&n("warn","MCP",`No default export found in ${s}`);continue}const o="function"==typeof i?i(a):i,r=o.name;t[r]=o,n&&n("info","MCP",`Loaded MCP server: ${r}`)}catch(e){n&&n("error","MCP",`Failed to load SDK MCP tools from ${s}: ${e instanceof Error?e.message:String(e)}`)}return t}class AgentRunners{static pool=new Map;static async create(e,a,n){const t=this.pool.get(a);if(t)return t;let s;if("claude"===e){const e=await loadClaudeAgentConfiguration({agentId:a,agentDir:n?.agentDir,logger:n?.logger});let t,i;n?.context&&a&&"default"!==a&&(t=await loadAgentHooks(a,n.agentDir,n.context)),n?.context&&e.customSdkMcpTools&&e.customSdkMcpTools.length>0&&(i=await loadSdkMcpTools(e.customSdkMcpTools,n.context,n.logger)),s=new ClaudeRunner(a,e,t,i)}else s=new CodexRunner;return this.pool.set(a,s),s}static release(e){this.pool.delete(e)}static releaseAll(){this.pool.clear()}}class NodeFileSystemAdapter{constructor(e){this.workingDirectory=e}async listFiles(e=3){const a=[];return this.listFilesRecursively(this.workingDirectory,a,"",e,0),a}async readFile(e){try{const a=path__namespace$1.join(this.workingDirectory,e);return fs__namespace$1.existsSync(a)?fs__namespace$1.readFileSync(a,"utf-8"):null}catch{return null}}async fileExists(e){const a=path__namespace$1.join(this.workingDirectory,e);return fs__namespace$1.existsSync(a)}listFilesRecursively(e,a,n,t,s){if(!(s>t))try{const i=fs__namespace$1.readdirSync(e,{withFileTypes:!0});for(const o of i){const i=n?`${n}/${o.name}`:o.name;o.isDirectory()?shared.IGNORED_DIRECTORIES.includes(o.name)||this.listFilesRecursively(path__namespace$1.join(e,o.name),a,i,t,s+1):o.isFile()&&a.push(i)}}catch(e){}}}async function detectPreviewMetadata(e){const a=new NodeFileSystemAdapter(e);return shared.detectPreview(a)}class Workspace{constructor(e){this.params=e}state=null;autoCommitPolicy="enabled";async setup(){const{options:e,handlers:a}=this.params,{userId:n,taskId:t,cwd:s}=e;if(!s)throw new Error("[WORKSPACE] Missing cwd for workspace setup");const i=_package.machine.getWorkspaceState(n,t),o=e.repositorySourceType,r={...e,repositorySourceType:o},{initialCommitHash:c,isGitRepository:p,autoCommitPolicy:l}=await this.ensureWorkspace(r,a,i?.initialCommitHash);await _package.machine.writeWorkspaceState(n,t,{initialized:!0,initializedAt:(new Date).toISOString(),cwd:s,repositorySourceType:r.repositorySourceType,userCwd:e.userCwd,forceUserCwd:e.forceUserCwd,gitUrl:e.gitUrl,baseBranch:e.baseBranch,taskRepositoryId:e.taskRepositoryId,initialCommitHash:c});const d=await handleGitStateOnWorkerStart(s,n,t,c,{autoCommitOnDirty:"enabled"===l});return this.state={cwd:s,initialCommitHash:c,isGitRepository:p,gitStateResult:d},this.autoCommitPolicy=l,p&&!e.taskRepositoryId&&await tryAssociateRepository(s,a),this.state}getState(){if(!this.state)throw new Error("[WORKSPACE] Workspace not initialized");return this.state}getCwd(){return this.getState().cwd}getInitialCommitHash(){return this.getState().initialCommitHash}getGitStateResult(){return this.getState().gitStateResult}async prepareResultArtifacts(e={}){const{cwd:a,initialCommitHash:n,isGitRepository:t}=this.getState(),{userId:s,taskId:i}=this.params.options;if(!t||!n)return{};const o=e.autoCommitOnDirty??"enabled"===this.autoCommitPolicy;if(await hasUncommittedChanges(a)&&o)try{const e=createAutoCommitMessage("result update",i);await autoCommit(a,e)}catch(a){e.onCommitError?.(a)}const r=await getCurrentCommitHash(a);try{await saveTaskPatchDiff(a,s,i,n,r)}catch(a){e.onPatchError?.(a)}const c=await getDiffStats(a,n,r);if(0===c.files.length)return{currentCommitHash:r};const p=await detectPreviewMetadata(a),l=await _package.machine.readLastSentCommitHash(s,i);return l&&l===r?{currentCommitHash:r}:{currentCommitHash:r,artifacts:{commitHash:r,stats:c,preview:p}}}async ensureWorkspace(e,a,n){const t=e.repositorySourceType;return"git-server"===t?this.ensureGitServerWorkspace(e,a,n):"directory"===t?this.ensureDirectoryWorkspace(e,a,n):this.ensureTemporaryWorkspace(e,a,n)}async ensureGitServerWorkspace(e,a,n){const{cwd:t,gitUrl:s,taskId:i,baseBranch:o,gitServerId:r}=e;if(!s)throw new Error("[WORKSPACE] gitUrl is required for git-server mode");const c=await isGitRepository(t),p=isDirectoryEmpty(t);if(!c){if(!p)throw new Error(`[WORKSPACE] Directory ${t} exists but is not a git repository.`);const e=await setupGitRepository(t,s,i,o,r)||await getCurrentCommitHash(t);return{initialCommitHash:this.resolveInitialCommitHash(n,e,"none"),isGitRepository:!0,autoCommitPolicy:"enabled"}}return await updateRemoteUrl(t,"origin",s),this.tryResolveDirtyRepo(e,a,n)}async ensureDirectoryWorkspace(e,a,n){const{cwd:t,taskId:s,userCwd:i}=e,o=await isGitRepository(t);if(isDirectoryEmpty(t)){if(!i)return{initialCommitHash:"",isGitRepository:!1,autoCommitPolicy:"enabled"};const e=i.replace(/^~/,os.homedir());if(isDirectoryEmpty(e))return{initialCommitHash:"",isGitRepository:!1,autoCommitPolicy:"enabled"};if(!await isGitRepository(e))return{initialCommitHash:"",isGitRepository:!1,autoCommitPolicy:"enabled"};await hasAnyCommits(e)||await initialCommit(e),await setupWorktreeWorkspace(e,t,s)}else if(!o)return{initialCommitHash:"",isGitRepository:!1,autoCommitPolicy:"enabled"};return this.tryResolveDirtyRepo(e,a,n)}async ensureTemporaryWorkspace(e,a,n){const{cwd:t,taskId:s}=e;if(!await isGitRepository(t)){await setupTmpRepoWorkspace(t,s,a),await ensureTaskBranch(t,`agentrix/${s}`,e.baseBranch);const i=await getCurrentCommitHash(t);return{initialCommitHash:this.resolveInitialCommitHash(n,i,"none"),isGitRepository:!0,autoCommitPolicy:"enabled"}}return this.tryResolveDirtyRepo(e,a,n)}async tryResolveDirtyRepo(e,a,n){let t,s=null,i="enabled";if(await checkUncommittedChanges(e.cwd)){const n=a?.onUncommittedChanges?await a.onUncommittedChanges():"Ignore";if(await handleUncommittedChanges(e.cwd,n),"Abort"===n)throw new Error("Task aborted by user due to uncommitted changes");s=n,"Ignore"===n&&(i="disabled_by_ignore")}if(await hasAnyCommits(e.cwd)||await initialCommit(e.cwd),"Ignore"===s){const a=`agentrix/${e.taskId}`;t=await getCurrentBranch(e.cwd)===a?"none":"kept"}else t=await this.tryResolveBranchMismatch(e);const o=await getCurrentCommitHash(e.cwd);return{initialCommitHash:this.resolveInitialCommitHash(n,o,t),isGitRepository:!0,autoCommitPolicy:i}}resolveInitialCommitHash(e,a,n){return e?"kept"===n?a:e:a}async tryResolveBranchMismatch(e){const a=`agentrix/${e.taskId}`;return await getCurrentBranch(e.cwd)===a?"none":(await ensureTaskBranch(e.cwd,a,e.baseBranch),"switched")}}const prInfoSchema=zod.z.object({title:zod.z.string().describe("Concise PR title following conventional commits format (feat/fix/docs/refactor/test/chore: description), maximum 50 characters"),description:zod.z.string().describe("Detailed PR description explaining: what changed, why these changes were necessary, any important technical decisions, and impact on existing functionality"),userMessage:zod.z.string().describe("Friendly message to display to the user, summarizing the PR creation. Should be concise and informative.")}),prInfoJsonSchema=zod.toJSONSchema(prInfoSchema),prInfoOpenAiSchema=zod.toJSONSchema(prInfoSchema);function parsePrInfoFromResult(e){if("success"!==e.subtype)throw new Error("PR response failed before structured output was returned");const a=e;return a.structured_output?prInfoSchema.parse(a.structured_output):parsePrInfo(a.result??"")}function extractJsonCandidate(e){const a=e.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);return a?a[1].trim():e.trim()}function parsePrInfo(e){if(!e.trim())throw new Error("PR response was empty");const a=extractJsonCandidate(e),n=JSON.parse(a);return prInfoSchema.parse(n)}class InProcessQueue{chain=Promise.resolve();run(e){const a=this.chain.then(e,e);return this.chain=a.then(()=>{},()=>{}),a}}class ClaudeWorker{constructor(e,a,n){this.credentials=e,this.options=a,this.workingDirectory=n;const t=this.options.input,{taskId:s,userId:i}=t;this.logger=_package.createLogger({type:"worker",taskId:s}),this.currentAgentSessionId="agentSessionId"in t?t.agentSessionId:void 0;const o=t.taskAgents||[];this.taskAgentsMap=new Map(o.map(e=>[e.id,e]));const r=this.taskAgentsMap.size>1;this.primaryAgentId=r?"planner":t.agentId,this.primaryAgentName=r?"planner":this.taskAgentsMap.get(t.agentId)?.name??"unknown";const c=this.createWorkerClientConfig(i,s,n),p=_package.machine.resolveDataDir(i,s);this.historyDb=getTaskDb({dataDir:p,taskId:s}),this.workClient=new WorkerClient(c.config,{...c.handlers,historyDb:this.historyDb}),this.coordinator=this.createMessageCoordinator(this.workClient,this.options.idleTimeoutSecond),this.agentContext=new AgentContextImpl({logger:this.logger,socketClient:this.workClient.client,taskId:t.taskId,userId:t.userId,chatId:t.chatId,rootTaskId:t.rootTaskId||t.taskId,parentTaskId:t.parentTaskId||null,workingDirectory:this.workingDirectory,taskAgents:t.taskAgents||[],serverUrl:_package.machine.serverUrl}),this.agentrixTools=this.createAgentrixTools();const l={...buildWorkspaceOptions(this.options.input),cwd:this.workingDirectory};this.workspace=new Workspace({options:l,handlers:this.createWorkspaceHandlers(this.workClient)})}abortController=new AbortController;isStopping=!1;askUserAwaiter=new Map;messageFilter=createMessageFilter();logger;workClient;workspace;coordinator;agentContext;runner;agentQueues=new Map;currentAgentSessionId;currentGroupId=null;historyDb;chatHistoryDb=null;agentrixTools;pendingPermissions=new Map;grantedPermissions=new Set;taskAgentsMap;messageSavedListener=null;messageDebounceHandle=null;messageDebounceMs=1e4;lastProcessedSequence=0;primarySessionReady=!1;pendingPrimaryLastSequence=null;primaryAgentId;primaryAgentName;newMessageGroupId(){return`group-${crypto.randomUUID()}`}refreshGroupId(){this.currentGroupId=this.newMessageGroupId()}shouldProcessMessage(e){const a=e.message,n=this.getRunnerMode(),t="group_chat"===n||"group_work"===n,s=shared.isAskUserResponseMessage(a);return!!shared.isCompanionHeartbeatMessage(a)||!!shared.isCompanionReminderMessage(a)||!(!shared.isSDKMessage(a)&&!s)&&(t?e.senderId!==this.primaryAgentId:!!s||"system"===e.senderType&&"user"===a.type||"user"===a.type)}shouldDropHeartbeatWhileBusy(){return this.coordinator.isActivelyExecuting()}async processPendingMessages(){const e=this.historyDb.pageMessagesAfter(this.lastProcessedSequence,100),a=[];for(const n of e.data)this.lastProcessedSequence=n.localSequence,this.shouldProcessMessage(n)&&a.push(n);if(a.length>0){this.deduplicateHeartbeats(a);const e=this.mergeConsecutiveHumanMessages(a),n=this.getRunnerMode();"group_chat"===n||"group_work"===n?await this.processMessagesAsGroup(e):await this.processMessagesIndividually(e)}e.hasMore&&await this.processPendingMessages()}deduplicateHeartbeats(e){let a=-1;for(let n=e.length-1;n>=0;n--)shared.isCompanionHeartbeatMessage(e[n].message)&&(-1===a?a=n:(e.splice(n,1),a--))}mergeConsecutiveHumanMessages(e){if(0===e.length)return[];const a=[];let n=0;for(;n<e.length;){const t=e[n];if("human"===t.senderType){const s=[t];for(;n+1<e.length;){const a=e[n+1];if("human"!==a.senderType||a.senderId!==t.senderId)break;s.push(a),n++}1===s.length?a.push(t):a.push(this.createMergedHumanMessage(s))}else a.push(t);n++}return a}createMergedHumanMessage(e){const a=[],n=[];for(const t of e){const e=t.message;if(!shared.isSDKMessage(e)||"user"!==e.type)continue;const s=e.message.content;if("string"==typeof s)a.push(s);else if(Array.isArray(s))for(const e of s)"text"===e.type?a.push(e.text):n.push(e)}const t=a.join(""),s=n.length>0?[{type:"text",text:t},...n]:t,i=e[0],o=e[e.length-1];return{localSequence:o.localSequence,eventId:o.eventId,senderType:i.senderType,senderId:i.senderId,senderName:i.senderName,createdAt:o.createdAt,message:{type:"user",message:{role:"user",content:s},parent_tool_use_id:null,session_id:i.message?.session_id||""}}}async processMessagesAsGroup(e){const a=[],n=[];for(const t of e){const e=formatHistoryMessage(t);if(e){const t=e.message.content;if("string"==typeof t)a.push(t);else if(Array.isArray(t))for(const e of t)"text"===e.type?a.push(e.text):n.push(e)}}if(0===a.length)return;const t=Math.max(...e.map(e=>e.localSequence)),s=a.join(" "),i={type:"user",message:{role:"user",content:n.length>0?[{type:"text",text:s},...n]:s},parent_tool_use_id:null,session_id:""};i.__localSequence=t,await this.coordinator.enqueue(i)}async processMessagesIndividually(e){for(const a of e){const e=this.formatSingleMessage(a);e&&(e.__localSequence=a.localSequence,await this.coordinator.enqueue(e))}}formatSingleMessage(e){const a=e.message;if(shared.isCompanionHeartbeatMessage(a))return{type:"user",message:{role:"user",content:`[heartbeat] You are being awakened by a scheduled heartbeat at ${a.timestamp}. Check your workspace for any pending tasks, reminders, or scheduled work. If nothing to do, respond briefly and exit.`},parent_tool_use_id:null,session_id:""};if(shared.isCompanionReminderMessage(a)){const e=a;let n=`[reminder from shadow] ${e.content}`;return e.filePath&&(n+=`\nDetailed analysis: ${e.filePath}`),{type:"user",message:{role:"user",content:n},parent_tool_use_id:null,session_id:""}}return shared.isSDKMessage(a)&&"user"===a.type?a:null}setupMessageSavedListener(){this.messageSavedListener=()=>{this.triggerMessageProcessing()},this.historyDb.on("message-saved",this.messageSavedListener)}triggerMessageProcessing(){const e=this.getRunnerMode();"group_chat"===e||"group_work"===e?this.scheduleProcessPendingMessages():this.processPendingMessages()}scheduleProcessPendingMessages(){this.coordinator?.setDebouncing(!0),this.messageDebounceHandle&&clearTimeout(this.messageDebounceHandle),this.messageDebounceHandle=setTimeout(async()=>{this.messageDebounceHandle=null,await this.processPendingMessages(),this.coordinator?.setDebouncing(!1)},this.messageDebounceMs)}async start(){let e="completed";try{await this.initialize(),await this.handleEvent(),await this.runClaude()}catch(a){if(!(a instanceof claudeAgentSdk.AbortError)){e="error",this.log("warn","AGENT","Fatal error:",a);const n=a instanceof Error?a.message:String(a);await this.reportFatalError(n)}}finally{await this.exitWorker(e)}}async initialize(){const e=this.options.input;await this.workClient.connect(),this.workClient.sendWorkerInitializing();const a=await AgentRunners.create("claude",e.agentId,{agentDir:e.agentDir,logger:this.log.bind(this),context:this.agentContext});this.runner=a,await this.workspace.setup(),await this.registerWithDaemon(this.workingDirectory),this.setEnvironmentVariables(),this.lastProcessedSequence=this.historyDb.getAgentLastSequences().get(this.primaryAgentId)??0,this.log("info","HISTORY",`Starting from sequence ${this.lastProcessedSequence} (tracking: ${this.primaryAgentId})`),this.currentAgentSessionId&&(this.historyDb.upsertAgentSession(this.primaryAgentId,this.currentAgentSessionId),this.primarySessionReady=!0),this.setupMessageSavedListener(),this.workClient.sendWorkerInitialized()}createWorkspaceHandlers(e){return{onRepositoryDetected:a=>{e.associateRepository(a.host,a.owner,a.repo,a.url)},onRepositoryInit:async e=>{await(this.runner?.executeHook("RepositoryInit",e))},onUncommittedChanges:this.onUncommittedChanges.bind(this),onBranchMismatch:this.onBranchMismatch.bind(this)}}async registerWithDaemon(e){const a=this.options.input.taskId,n=await notifyDaemonSessionStarted(a,{cwd:e,machineId:this.credentials.machineId,pid:process.pid,startedBy:this.options.startedBy||"terminal"});n.error?this.log("warn","DAEMON",`Failed to report session ${a}:`,n.error):this.log("info","DAEMON",`Session ${a} registered`)}setEnvironmentVariables(){this.options.input.environmentVariables&&Object.entries(this.options.input.environmentVariables).forEach(([e,a])=>{null!=a&&(process.env[e]=String(a))}),this.options.input.api_base_url&&(process.env.ANTHROPIC_BASE_URL=this.options.input.api_base_url),this.options.input.api_key&&(process.env.ANTHROPIC_AUTH_TOKEN=this.options.input.api_key)}createMessageCoordinator(e,a){const n=1e3*Math.max(0,a??0);return this.coordinator=new Coordinator({workerType:"claude",workClient:e,onCommandMessageProcessed:e=>{this.markPrimaryMessageProcessed(e)},handlers:{onNormalMessage:async e=>e,onBashCommand:async(e,a)=>{await this.executeBashCommand(e)},onMergeRequest:async e=>{await this.executeMergeRequest()},onMergePr:async()=>{await this.executeMergePr()},onNewSession:async()=>{await this.executeNewSession()}},logger:(e,a,n)=>{const t=e;this.log(t,a,n)},idleTimeoutMs:n,onIdleTimeout:()=>this.stopTask("idle")}),this.coordinator}handleEvent(){const e=this.options.input.event,a=this.options.input.eventData;if("sub-task-result-updated"===e){const e=a,n=buildSubTaskResultMessage(e,this.options.dataEncryptionKey);this.historyDb.saveMessage({eventId:e.eventId||`sub-task-${Date.now()}`,message:n,senderType:"system",senderId:"system",senderName:"system"})}this.triggerMessageProcessing()}async executeMergeRequest(){this.log("info","MERGE","Executing merge-request command");const e=this.getRunnerMode(),a="group_chat"===e||"group_work"===e;try{if(!this.options.input.repositoryId){const e="Cannot create PR: task has no git repository configured.";return this.log("warn","MERGE","No repositoryId found in task input"),void this.workClient.sendSystemErrorMessage(e,{groupId:this.currentGroupId??void 0})}await hasUncommittedChanges(this.workingDirectory)&&(await autoCommit(this.workingDirectory,"Checkpoint for PR generation"),this.log("info","MERGE","Auto-committed changes"));const e=await getCurrentCommitHash(this.workingDirectory),n=this.workspace.getInitialCommitHash();if(!n){const e="Cannot create PR: initial commit hash is missing.";return this.log("error","MERGE",e),void this.workClient.sendSystemErrorMessage(e,{groupId:this.currentGroupId??void 0})}if(0===(await getDiffStats(this.workingDirectory,n,e)).files.length){const e="No changes to create PR: no files changed since task started";return void this.workClient.sendSystemErrorMessage(e,{groupId:this.currentGroupId??void 0})}const t=await getCurrentBranch(this.workingDirectory);this.log("info","MERGE",`Pushing branch ${t} to remote`),await pushForTask(this.workingDirectory,t,!1,this.options.input.gitServerId),this.log("info","MERGE","Successfully pushed branch to remote");const s=this.runner?.getAgentConfiguration(),i=buildPRRequestPrompt(n,(s?.customPRPromptTemplate?applyPRPromptTemplate(s.customPRPromptTemplate,{initialCommitHash:n,currentCommitHash:"",branchName:""}):void 0)??void 0);this.log("debug","MERGE",`PR prompt: ${i.substring(0,200)}...`);const o=this.runner;let r=null;const c=o.runStreamed(i,{cwd:this.workingDirectory,model:this.options.input.model,abortController:this.abortController,modeConfig:this.getRunnerModeConfig(),agentrixTools:this.agentrixTools,structuredOutputSchema:{type:"json_schema",schema:prInfoJsonSchema}});for await(const e of c){if(this.logger.debug(`sdk message: ${JSON.stringify(e)}`),"result"===e.type){r=e;break}const n=a?e:this.messageFilter.filter(e);null!==n&&this.workClient.sendTaskEvent(this.getChatSenderMeta(),n,{groupId:this.currentGroupId??void 0})}if(!r)throw new Error("Merge-request did not return a result message");const p=parsePrInfoFromResult(r),l=await this.workClient.sendMergeRequest(p.title,p.description);this.workClient.sendAssistantMessage(`${p.userMessage}\n\n✅ Pull request created successfully!\nNumber: #${l.pullRequestNumber}\nURL: ${l.pullRequestUrl}`,{groupId:this.currentGroupId??void 0})}catch(e){const a=e instanceof Error?e.message:String(e);this.log("error","MERGE","Merge-request failed:",e),this.workClient.sendSystemErrorMessage(`❌ Merge-request failed: ${a}\n\nPlease check git status and try again, or create the PR manually.`,{groupId:this.currentGroupId??void 0})}}async executeBashCommand(e){this.log("info","BASH",`Executing command: ${e}`);const a={senderType:"agent",senderId:"bash",senderName:"bash"},n=await executeCommandStreaming(e,this.workingDirectory,{onOutput:e=>{this.workClient.sendTaskMessage(a,e,{groupId:this.currentGroupId??void 0})},onComplete:e=>{this.log("info","BASH",`Command completed with exit code: ${e}`)}});this.log("info","BASH",`Worker ready after command execution (exit code: ${n})`)}async executeMergePr(){await executeMergePr({workingDirectory:this.workingDirectory,workClient:this.workClient,repositoryId:this.options.input.repositoryId,gitServerId:this.options.input.gitServerId,logger:this.logger,askUser:e=>this.askUser(e,{onTimeout:"abort_task"})})}async executeNewSession(){this.log("info","SESSION","Executing new-session: clearing agentSessionId"),this.currentAgentSessionId=void 0,this.primarySessionReady=!1,this.workClient.sendResetTaskSession(),this.log("info","SESSION","Session reset sent, stopping task for clean restart"),this.stopTask("event")}async runClaude(){this.log("info","AGENT",`Starting Claude agent for task ${this.taskId}`);const e=this.currentAgentSessionId,a=this.runner,n=this.getRunnerModeConfig(),t="group_chat"===n.mode||"group_work"===n.mode,s=this.createPermissionHandler(),i=this.buildSystemHooks({trackBackgroundTasks:!0,trackPrimaryAgentStop:!0}),o=a.loop({cwd:this.workingDirectory,model:this.options.input.model,agentSessionId:e,abortController:this.abortController,stderr:e=>{this.log("debug","SDK",e)},modeConfig:n,agentrixTools:this.agentrixTools,canUseTool:s,hooks:i,maxTurns:this.options.input.maxTurns??void 0});(async()=>{try{for(;!this.isStopping;){const e=await this.coordinator.waitForAgentMessage();if(!e){if(this.isStopping)break;continue}o.push(e);const a=e.__localSequence;void 0!==a&&(this.markPrimaryMessageProcessed(a),delete e.__localSequence)}}catch(e){this.log("error","AGENT","Message pump failed:",e),this.stopTask("event")}})();for await(const e of o.events){if(this.logger.debug(`sdk message: ${JSON.stringify(e)}`),"system"===e.type&&"init"===e.subtype){this.workClient.sendUpdateTaskAgentSessionId(e.session_id),this.currentAgentSessionId=e.session_id,this.historyDb.upsertAgentSession(this.primaryAgentId,e.session_id),this.primarySessionReady=!0,null!==this.pendingPrimaryLastSequence&&(this.historyDb.updateAgentLastSequence(this.primaryAgentId,this.pendingPrimaryLastSequence),this.pendingPrimaryLastSequence=null),this.refreshGroupId(),this.updateAgentRunning(!0);continue}if("result"===e.type){await this.handleSdkResultMessage(e),this.updateAgentRunning(!1);continue}"system"===e.type&&"task_notification"===e.subtype&&this.handleBackgroundTaskNotification(e);const a=t?e:this.messageFilter.filter(e);null!==a&&this.workClient.sendTaskEvent(this.getChatSenderMeta(),a,{groupId:this.currentGroupId??void 0})}this.log("info","AGENT",`Claude agent finished for task ${this.taskId}`)}updateAgentRunning(e){this.coordinator?.setAgentRunning(this.primaryAgentId,this.primaryAgentName,e)}markPrimaryMessageProcessed(e){this.historyDb.updateAgentLastSequence(this.primaryAgentId,e),this.primarySessionReady||(this.pendingPrimaryLastSequence=null===this.pendingPrimaryLastSequence?e:Math.max(this.pendingPrimaryLastSequence,e))}stopTask(e){this.isStopping||(this.isStopping=!0,"idle"===e?this.log("info","AGENT","Idle timeout reached, stopping task"):"ask_user_timeout"===e&&this.log("info","AGENT","ask_user timed out, stopping task"),this.askUserAwaiter.clear(),this.coordinator?.stop(),this.abortController.abort())}async handleAskUserQuestionPermission(e){const a=e,n=Array.isArray(a.questions)?a.questions:[];if(0===n.length)return this.log("warn","PERMISSION","AskUserQuestion missing questions"),{behavior:"deny",message:"AskUserQuestion missing questions"};const t=n.map(e=>({...e,options:[...e.options,{label:"Other",description:""}]}));try{const e=await this.askUser(t),s={};for(let a=0;a<n.length;a+=1){const t=n[a]?.question;if(!t)continue;const i=e.answers?.[a];"string"==typeof i&&(s[t]=i)}return{behavior:"allow",updatedInput:{...a,answers:s}}}catch(e){return this.log("warn","PERMISSION",`AskUserQuestion failed: ${e}`),{behavior:"deny",message:"AskUserQuestion failed"}}}createPermissionHandler(){return async(e,a)=>{if("AskUserQuestion"===e)return this.handleAskUserQuestionPermission(a);if(this.grantedPermissions.has(e))return this.log("info","PERMISSION",`Tool "${e}" already granted, skipping`),{behavior:"allow",updatedInput:a};const n=this.pendingPermissions.get(e);if(n)return this.log("info","PERMISSION",`Tool "${e}" has pending request, waiting...`),"allow"===await n?{behavior:"allow",updatedInput:a}:{behavior:"deny",message:"Permission denied by user"};let t;this.log("info","PERMISSION",`Requesting permission for "${e}"`);const s=new Promise(e=>{t=e});this.pendingPermissions.set(e,s);try{const n=await this.requestToolPermission(e);return t(n),"allow"===n?(this.grantedPermissions.add(e),{behavior:"allow",updatedInput:a}):{behavior:"deny",message:"Permission denied by user"}}catch(e){return t("deny"),{behavior:"deny",message:"Permission request failed"}}finally{this.pendingPermissions.delete(e)}}}async requestToolPermission(e){const a=[{question:`Tool "${e}" is requesting permission to execute. Allow this operation?`,header:"Permission",multiSelect:!1,options:[{label:"Allow",description:"Allow this tool to execute"},{label:"Deny",description:"Deny this tool execution"}]}];try{return"Allow"===(await this.askUser(a,{onTimeout:"abort_task"})).answers[0]?"allow":"deny"}catch(e){return this.log("warn","PERMISSION",`Permission request failed: ${e}`),"deny"}}async askUser(e,a={}){const n=this.workClient;return askUserWithTimeout(e,this.askUserAwaiter,{sendAskUser:e=>n.sendAskUser(this.getChatSenderMeta(),e,{groupId:this.currentGroupId??void 0}),sendAskUserResponse:(e,a)=>n.sendAskUserResponse(e,a),onTimeoutMessage:e=>n.sendAssistantMessage(e,{groupId:this.currentGroupId??void 0}),stopTask:e=>this.stopTask(e)},a)}async onUncommittedChanges(){const e=[{question:"Uncommitted changes detected in the working directory. How would you like to proceed?",header:"Git Status",multiSelect:!1,options:[{label:"Ignore",description:"Keep changes on current branch and continue without switching"},{label:"Commit",description:"Commit on current branch, then switch to task branch"},{label:"Stash",description:"Stash changes, then switch to task branch"},{label:"Abort",description:"Cancel the task, do nothing"}]}];try{const a=(await this.askUser(e,{onTimeout:"abort_task"})).answers[0];return a.startsWith("other:")?(this.log("info","GIT",`User provided custom input: ${a}, defaulting to Abort`),"Abort"):{Ignore:"Ignore",Commit:"Commit",Stash:"Stash",Abort:"Abort"}[a]||"Abort"}catch(e){return this.log("warn","GIT",`Failed to get user response for uncommitted changes: ${e}`),"Abort"}}async onBranchMismatch(e){const a=[{label:"Switch",description:`Checkout ${e.expectedBranch} and continue`},{label:"Keep",description:`Continue on ${e.currentBranch} (may affect task history)`},{label:"Abort",description:"Cancel the task"}],n=[{question:`Branch mismatch detected. Current: ${e.currentBranch}. Expected: ${e.expectedBranch}. How would you like to proceed?`,header:"Git Branch",multiSelect:!1,options:a}];try{const e=(await this.askUser(n,{onTimeout:"abort_task"})).answers[0];return e.startsWith("other:")?(this.log("info","GIT",`User provided custom input: ${e}, defaulting to Abort`),"Abort"):{Switch:"Switch",Keep:"Keep",Abort:"Abort"}[e]||"Abort"}catch(e){return this.log("warn","GIT",`Failed to get user response for branch mismatch: ${e}`),"Abort"}}getRunnerMode(){const e=this.taskAgentsMap.size>1,a=this.options.input.taskType,n=!(!process.env.AGENTRIX_COMPANION_HOME&&!process.env.AGENTRIX_COMPANION_WORKSPACE);return"shadow"===a?"companion_shadow":n&&"chat"===a?"companion_chat":e?"chat"===a?"group_chat":"group_work":"chat"===a?"chat":"work"}getGroupAgents(){if(!(this.taskAgentsMap.size<=1))return Array.from(this.taskAgentsMap.values()).map(e=>({id:e.id,name:e.name,description:e.description}))}getRunnerModeConfig(){return{mode:this.getRunnerMode(),supportChangeTitle:this.supportChangeTitle,groupAgents:this.getGroupAgents()}}get supportChangeTitle(){const e=this.options.input.customTitle;return!("string"==typeof e&&e.trim().length>0)}createAgentrixTools(){const e=this.taskAgentsMap.size>1;if("companion_shadow"===this.getRunnerMode()){const e=this.options.input.chatId,a=this.options.input.userId,n=_package.machine.resolveDataDir(a,e);this.chatHistoryDb=getTaskDb({dataDir:n,taskId:e})}return createAgentrixMcpTools({agentContext:this.agentContext,workClient:this.workClient,uploadFile:e=>this.agentContext.uploadFile(e),agentId:this.primaryAgentId,isGroup:e,historyDb:this.historyDb,chatHistoryDb:this.chatHistoryDb??void 0,askUser:e=>this.askUser(e),log:this.log.bind(this),isMergeRequestActive:()=>!1,clearMergeRequest:()=>{},invokeAgent:(e,a)=>this.invokeAgent(e,a),assign:(e,a,n)=>this.assignWork(e,a,n)})}resolveTaskAgentName(e){return this.taskAgentsMap.get(e)?.name||""}getChatSenderMeta(){return{senderType:"agent",senderId:this.primaryAgentId,senderName:this.primaryAgentName}}sendAgentErrorMessage(e,a,n,t){const s=a||e,i={type:"assistant",session_id:"",uuid:crypto.randomUUID(),parent_tool_use_id:null,message:{role:"assistant",content:[{type:"text",text:`System Error\n\n${s}: ${n}`}]}};this.workClient.sendTaskMessage({senderType:"agent",senderId:e,senderName:s},i,{groupId:t?.groupId})}async invokeAgent(e,a){const n=this.buildSubAgentHistoryContext(e,a);if(!n)return!1;const t=this.taskAgentsMap.get(e),s=t?.type||"claude";let i=this.agentQueues.get(e);i||(i=new InProcessQueue,this.agentQueues.set(e,i));const o=this.resolveTaskAgentName(e),r=this.getRunnerMode(),c="group_chat"===r||"group_work"===r;return i.run(async()=>{this.coordinator?.setAgentRunning(e,o,!0);const a=this.newMessageGroupId();try{const t=await AgentRunners.create(s,e,{logger:this.log.bind(this),context:this.agentContext}),i=this.getGroupAgents()||[],r={mode:"reply",supportChangeTitle:!1,groupAgents:i},p=this.createPermissionHandler(),l=this.buildSystemHooks({trackBackgroundTasks:!1}),d=createMessageFilter(),u=t.loop({cwd:this.workingDirectory,model:this.options.input.model,agentSessionId:n.sessionId,abortController:this.abortController,modeConfig:r,agentrixTools:this.agentrixTools,canUseTool:p,hooks:l,maxTurns:this.options.input.maxTurns??void 0});let m=n.message;if("codex"===s&&!n.sessionId){const a=[buildAgentContextPrompt(e,i),"=== CONVERSATION STREAM START FROM HERE ===",extractUserMessageText(n.message)].join("\n\n").trim();a&&(m=a)}u.push(m);const g=n.lastSequence;let h=!1;n.sessionId&&(this.historyDb.updateAgentLastSequence(e,g),h=!0);let f=!1;for await(const n of u.events){if("system"===n.type&&"init"===n.subtype){this.historyDb?.upsertAgentSession(e,n.session_id),h||(this.historyDb.updateAgentLastSequence(e,g),h=!0);continue}if("result"===n.type){this.workClient.sendTaskMessage({senderType:"agent",senderId:e,senderName:o},n,{groupId:a}),f=!0;break}const t=c?n:d.filter(n);t&&this.workClient.sendTaskEvent({senderType:"agent",senderId:e,senderName:o},t,{groupId:a})}}catch(a){this.log("error","INVOKE",`Invoke failed for ${e}:`,a)}finally{this.coordinator?.setAgentRunning(e,o,!1)}}),!0}async assignWork(e,a,n){const t=this.taskAgentsMap.get(e),s=t?.type||"claude";let i=this.agentQueues.get(e);i||(i=new InProcessQueue,this.agentQueues.set(e,i));const o=this.resolveTaskAgentName(e),r=this.getRunnerMode(),c="group_chat"===r||"group_work"===r;return i.run(async()=>{this.coordinator?.setAgentRunning(e,o,!0);const t=this.newMessageGroupId();n&&this.workClient.sendTaskMessage({senderType:"agent",senderId:e,senderName:o},createClaudeAssistantMessage(n),{groupId:this.newMessageGroupId()});try{const n=await AgentRunners.create(s,e,{logger:this.log.bind(this),context:this.agentContext}),i={mode:"work",supportChangeTitle:!1},r=this.createPermissionHandler(),p=this.buildSystemHooks({trackBackgroundTasks:!1}),l=createMessageFilter(),d=n.loop({cwd:this.workingDirectory,model:this.options.input.model,abortController:this.abortController,modeConfig:i,agentrixTools:this.agentrixTools,canUseTool:r,hooks:p,maxTurns:this.options.input.maxTurns??void 0});d.push(a);let u=!1;for await(const a of d.events){if("system"===a.type&&"init"===a.subtype)continue;if("result"===a.type){this.workClient.sendTaskMessage({senderType:"agent",senderId:e,senderName:o},a,{groupId:t}),u=!0;break}const n=c?a:l.filter(a);n&&this.workClient.sendTaskEvent({senderType:"agent",senderId:e,senderName:o},n,{groupId:t})}}catch(a){this.log("error","RUN_TASK",`Run task failed for ${e}:`,a);const n=a instanceof Error?a.message:String(a);this.sendAgentErrorMessage(e,o,`I meet some error: ${n}`,{groupId:t})}finally{this.coordinator?.setAgentRunning(e,o,!1)}})}buildSubAgentHistoryContext(e,a){const n=this.historyDb;if(!n)return this.log("warn","HISTORY","Task history DB unavailable; delegate cannot build context."),null;const t=n.getAgentSessions().get(e),s=n.getAgentLastSequences().get(e)??0,i=n.pageRecentMessagesAfter(s,20);if(0===i.data.length&&!a)return null;const o=this.mergeConsecutiveHumanMessages(i.data),r=this.buildHistoryMessages(o,a);return r?{message:r,sessionId:t,lastSequence:i.data.length>0?i.data[i.data.length-1].localSequence:s}:null}buildHistoryMessages(e,a){const n=[];for(const a of e){const e=formatHistoryMessageXml(a);e&&n.push(e)}if(0===n.length&&!a)return null;let t=n.join("\n");return a&&(t=`<hint>\n${a}\n</hint>\n\n${t}`),{type:"user",message:{role:"user",content:t},parent_tool_use_id:null,session_id:""}}buildSystemHooks(e){const a=e?.trackBackgroundTasks??!0,n=e?.trackPrimaryAgentStop??!1,t={};return a&&(t.PostToolUse=async e=>(this.trackBackgroundTaskFromPostToolUse(e),{})),n&&(t.Stop=async()=>(this.updateAgentRunning(!1),{})),t}trackBackgroundTaskFromPostToolUse(e){if(!e||"object"!=typeof e)return void this.log("debug","TASK","PostToolUse hook input is not an object");const a=e,n=a.tool_input;if(!n||!0!==n.run_in_background)return;const t=this.extractBackgroundTaskId(a.tool_response);if(!t)return this.log("debug","TASK",`PostToolUse(${a.tool_name}) run_in_background=true but no task_id found, using anonymous tracking`),void this.coordinator?.setAnonymousBackgroundTaskRunning(!0);this.coordinator?.setBackgroundTaskRunning(t,!0),this.log("info","TASK",`Background task started: ${t} (tool: ${a.tool_name})`)}handleBackgroundTaskNotification(e){this.updateAgentRunning(!0),this.coordinator?.setBackgroundTaskRunning(e.task_id,!1),this.log("info","TASK",`Background task ${e.task_id} ${e.status}`)}extractBackgroundTaskId(e){const a=new Set,n=new Set,t=e=>{if("string"!=typeof e)return;const n=e.trim();n&&a.add(n)},s=e=>{if(null==e)return;if("string"==typeof e)return void(e=>{const a=/(task[_-]?id|agent[_-]?id|shell[_-]?id)["'\s:=]+([A-Za-z0-9._:-]+)/gi;let n;for(;null!==(n=a.exec(e));)t(n[2])})(e);if("object"!=typeof e)return;if(n.has(e))return;if(n.add(e),Array.isArray(e)){for(const a of e)s(a);return}const a=e;"string"==typeof a.task_id&&t(a.task_id),"string"==typeof a.taskId&&t(a.taskId),"string"==typeof a.agent_id&&t(a.agent_id),"string"==typeof a.agentId&&t(a.agentId),"string"==typeof a.shell_id&&t(a.shell_id),"string"==typeof a.shellId&&t(a.shellId);for(const e of Object.values(a))s(e)};s(e);const i=[...a];return i.length>1&&this.log("warn","TASK",`Multiple background task ids extracted (${i.join(", ")}), using first id ${i[0]}`),i[0]}createWorkerClientConfig(e,a,n){const t=this.options.input.agentId,s=this.taskAgentsMap.get(t)?.name;return{config:{userId:e,taskId:a,chatId:this.options.input.chatId,machineId:this.credentials.machineId,agentId:t,agentName:s,cwd:n,serverUrl:_package.machine.serverUrl.replace(/^http/,"ws"),path:"/v1/ws",auth:shared.workerAuth(this.credentials.token,this.credentials.machineId,a),dataEncryptionKey:this.options.dataEncryptionKey??null,keepAliveConfig:{intervalMs:2e4,event:"worker-alive",payloadGenerator:()=>{const e=this.coordinator?.getStatus(),n="running"===e?.state?"worker-running":"worker-ready";return{eventId:shared.createEventId(),status:n,taskId:a,machineId:this.credentials.machineId,timestamp:Date.now().toString(),activeAgents:this.coordinator?.getActiveAgents()}}},healthCheckConfig:{enabled:!0,intervalMs:3e4,timeoutMs:5e3},logger:(e,...a)=>this.logger.info(`[SOCKET] ${e}`,...a)},handlers:{attachmentsDir:_package.machine.resolveAttachmentsDir(e,a),logger:(e,a,n,...t)=>{this.log(e,a,n,...t)},stopTask:async()=>{this.stopTask("event")},shouldPersistTaskMessage:async e=>!shared.isCompanionHeartbeatMessage(e)||!this.shouldDropHeartbeatWhileBusy()||(this.log("debug","WORKER","Dropping heartbeat at WorkerClient receive stage: agent is running"),!1),onTaskMessage:async(e,a)=>{if(shared.isAskUserResponseMessage(e)){const[a,n]=this.askUserAwaiter.entries().next().value||[];a&&n&&(this.askUserAwaiter.delete(a),n(e))}},onTaskInfoUpdate:async e=>{applyTaskInfoUpdate(e,this.options.input)},onWorkerStatusRequest:async()=>{const{state:e}=this.coordinator.getStatus();"running"===e?this.workClient.sendWorkRunning():"idle"===e&&this.workClient.sendWorkerReady()},onSubTaskResultUpdated:async e=>{const a=buildSubTaskResultMessage(e,this.options.dataEncryptionKey);await this.coordinator.enqueue(a)}}}}async exitWorker(e){this.log("info","WORKER",`Exiting with status: ${e} for task ${this.taskId}`),this.coordinator&&this.coordinator.stop(),this.workClient&&(this.workClient.sendWorkerExit(e),await this.workClient.disconnect()),this.historyDb&&this.historyDb.close(),this.chatHistoryDb&&this.chatHistoryDb.close(),process.exit(0)}async reportFatalError(e){this.workClient.sendSystemErrorMessage(e,{groupId:this.currentGroupId??void 0})}log(e,a,n,...t){this.logger&&this.logger[e](`[${a}] ${n}`,...t)}get taskId(){return this.options.input.taskId}async handleSdkResultMessage(e){let a,n;try{const e=await this.workspace.prepareResultArtifacts({onCommitError:e=>{this.log("warn","GIT","Failed to auto-commit changes before result message:",e)},onPatchError:e=>{this.log("warn","GIT","Failed to write patch diff for result:",e)}});a=e.artifacts,n=e.currentCommitHash}catch(e){this.log("warn","GIT","Failed to prepare git artifacts for result:",e)}const t=this.getRunnerMode();if("group_chat"===t||"group_work"===t?this.workClient.sendTaskEvent(this.getChatSenderMeta(),e,{...a?{artifacts:a}:{},groupId:this.currentGroupId??void 0}):this.workClient.sendTaskMessage(this.getChatSenderMeta(),e,{...a?{artifacts:a}:{},groupId:this.currentGroupId??void 0}),n)try{await markCommitAsSent(this.options.input.userId,this.taskId,n)}catch(e){this.log("warn","GIT","Failed to mark commit as sent:",e)}}}class CwdCalculator{static async calculateFinalCwd(e){const{repositorySourceType:a,cwd:n,userCwd:t,userId:s,taskId:i,forceUserCwd:o}=e;if(n)return n;const r=_package.machine.resolveProjectDir(s,i);if("directory"===a&&t){const e=t.replace(/^~/,os.homedir());return o?e:await this.shouldUseWorktree(e)?r:e}return r}static async shouldUseWorktree(e){try{return!isDirectoryEmpty(e)&&await isGitRepository(e)}catch{return!1}}}async function runClaude(e,a){const n=buildWorkspaceOptions(a.input),t=await CwdCalculator.calculateFinalCwd(n),s=new ClaudeWorker(e,a,t);await s.start()}var require$$0=getAugmentedNamespace(_package.logger$1);class CodexWorker{constructor(e,a){this.credentials=e,this.options=a}context;threadId=null;isStopping=!1;filteredToolUseIds=new Set;currentModel=null;dataEncryptionKey=null;abortController=new AbortController;coordinator;logger;askUserAwaiter=new Map;workClient;workspace;historyDb=null;currentGroupId=null;refreshGroupId(){this.currentGroupId=`group-${node_crypto.randomUUID()}`}async start(){try{await this.initialize(),await this.handleEvent(),await this.runCodex(),await this.exitWorker("completed")}catch(e){if(!this.isStopping){this.log("warn","AGENT","Fatal error:",e);const a=e instanceof Error?e.message:String(e);throw await this.exitWorker("error",a),e}this.log("info","AGENT",`Task ${this.taskId} stopped gracefully`),await this.exitWorker("completed")}finally{process.exit(0)}}async initialize(){const e=this.options.input.taskId,a=this.options.input.userId;this.logger=this.createLogger({type:"worker",taskId:e}),this.dataEncryptionKey=this.options.dataEncryptionKey??null;const n=buildWorkspaceOptions(this.options.input),t=await CwdCalculator.calculateFinalCwd(n),s={...n,cwd:t};this.log("info","INIT",`Phase 1: Working directory: ${t}`);const i=this.createWorkerClientConfig(a,e,t),o=_package.machine.resolveDataDir(a,e);this.historyDb=getTaskDb({dataDir:o,taskId:e});const r=new WorkerClient(i.config,{...i.handlers,historyDb:this.historyDb});this.workClient=r,this.log("info","INIT","Phase 2: WorkerClient created");const c=1e3*Math.max(0,this.options.idleTimeoutSecond??0);this.coordinator=this.createMessageCoordinator(r,c),this.log("info","INIT","Phase 3: Coordinator created"),await r.connect(),r.sendWorkerInitializing(),this.log("info","INIT","Phase 4: Connected to server"),this.log("info","INIT","Phase 5: Skipped (no AgentContext for Codex)"),this.log("info","INIT","Phase 6: Skipped (no custom resources for Codex)");const p=new Workspace({options:s,handlers:this.createWorkspaceHandlers(r)}),{initialCommitHash:l,gitStateResult:d}=await p.setup();this.workspace=p,this.log("info","INIT","Phase 7: Workspace setup complete"),r.sendWorkerInitialized(),this.log("info","INIT","Phase 8: Initialization finalized"),await this.registerWithDaemon(t),this.log("info","INIT","Phase 9: Registered with daemon"),this.context={credentials:this.credentials,options:this.options,workClient:r,workingDirectory:t,initialCommitHash:l,logger:this.logger},process.env.AGENTRIX_WORKING_DIR=t,process.env.AGENTRIX_WORKING_USER=a,process.env.AGENTRIX_WORKING_TASK=e,this.options.input.environmentVariables&&Object.entries(this.options.input.environmentVariables).forEach(([e,a])=>{null!=a&&(process.env[e]=String(a))}),this.options.input.api_base_url&&(process.env.OPENAI_BASE_URL=this.options.input.api_base_url),this.options.input.api_key&&(process.env.CODEX_API_KEY=this.options.input.api_key),"agentSessionId"in this.options.input&&this.options.input.agentSessionId&&(this.threadId=this.options.input.agentSessionId,this.log("info","AGENT",`Resuming thread: ${this.threadId}`))}createWorkspaceHandlers(e){return{onRepositoryDetected:a=>{e.associateRepository(a.host,a.owner,a.repo,a.url)},onUncommittedChanges:this.onUncommittedChanges.bind(this),onBranchMismatch:this.onBranchMismatch.bind(this)}}async registerWithDaemon(e){const a=this.options.input.taskId,n=await notifyDaemonSessionStarted(a,{cwd:e,machineId:this.credentials.machineId,pid:process.pid,startedBy:this.options.startedBy||"terminal"});n.error?this.log("warn","DAEMON",`Failed to report session ${a}:`,n.error):this.log("info","DAEMON",`Session ${a} registered`)}createMessageCoordinator(e,a){return this.coordinator=new Coordinator({workerType:"codex",workClient:e,handlers:{onNormalMessage:async e=>this.convertSDKMessageToCodexInput(e),onBashCommand:async(e,a)=>{await this.executeBashCommand(e)},onMergeRequest:async e=>{await this.executeMergeRequest()},onMergePr:async()=>{await this.executeMergePr()},onNewSession:async()=>{await this.executeNewSession()}},logger:(e,a,n)=>{const t=e;this.log(t,a,n)},idleTimeoutMs:a,onIdleTimeout:()=>this.stopTask("idle")}),this.coordinator}async handleEvent(){if("task-message"===this.options.input.event){const e=this.options.input.eventData.message;e&&shared.isSDKMessage(e)&&"user"===e.type&&await this.coordinator.enqueue(e)}}async executeMergeRequest(){this.log("info","MERGE","Executing merge-request command");try{if(!this.options.input.repositoryId){const e="Cannot create PR: task has no git repository configured.";return this.log("warn","MERGE","No repositoryId found in task input"),void this.context.workClient.sendSystemErrorMessage(e,{groupId:this.currentGroupId??void 0})}await hasUncommittedChanges(this.context.workingDirectory)&&(await autoCommit(this.context.workingDirectory,"Update task changes"),this.log("info","MERGE","Auto-committed changes"));const e=await getCurrentCommitHash(this.context.workingDirectory),a=this.context.initialCommitHash,n=await getCurrentBranch(this.context.workingDirectory);if(this.log("info","MERGE",`Pushing branch ${n} to remote`),await pushForTask(this.context.workingDirectory,n,!1,this.options.input.gitServerId),this.log("info","MERGE","Successfully pushed branch to remote"),!a){const e="Cannot create PR: initial commit hash is missing.";return this.log("error","MERGE",e),void this.context.workClient.sendSystemErrorMessage(e,{groupId:this.currentGroupId??void 0})}if(0===(await getDiffStats(this.context.workingDirectory,a,e)).files.length){const e="No changes to create PR: no files changed since task started";return void this.context.workClient.sendSystemErrorMessage(e,{groupId:this.currentGroupId??void 0})}const t=buildPRRequestPrompt(a);this.log("debug","MERGE",`PR prompt: ${t.substring(0,200)}...`);const s=this.options.input.agentId??"default",i=await AgentRunners.create("codex",s),o={mode:"work",supportChangeTitle:!1},r=i.runStreamed(t,{cwd:this.context.workingDirectory,model:this.currentModel||void 0,abortController:this.abortController,modeConfig:o,structuredOutputSchema:{type:"json_schema",schema:prInfoOpenAiSchema}});let c=null;for await(const e of r){if(this.context.logger.debug(`sdk message: ${JSON.stringify(e)}`),"result"===e.type){c=e;break}const a=this.filterMessages(e);null!==a&&this.context.workClient.sendTaskEvent(this.getChatSenderMeta(),a,{groupId:this.currentGroupId??void 0})}if(!c)throw new Error("Merge-request did not return a result message");const p=parsePrInfoFromResult(c);await this.createPullRequest(p.title,p.description),this.sendMessage(p.userMessage)}catch(e){const a=e instanceof Error?e.message:String(e);this.log("error","MERGE","Merge-request failed:",e),this.context.workClient.sendSystemErrorMessage(`Merge-request failed: ${a}\n\n`,{groupId:this.currentGroupId??void 0})}}async executeChangeTitle(e){this.log("info","WORKER",`Changing task title to: ${e}`),this.context.workClient.sendChangeTaskTitle(e)}async executeBashCommand(e){this.log("info","BASH",`Executing command: ${e}`);const a=await executeCommandStreaming(e,this.context.workingDirectory,{onOutput:e=>{this.context.workClient.sendTaskMessage(this.getChatSenderMeta(),e,{groupId:this.currentGroupId??void 0})},onComplete:e=>{this.log("info","BASH",`Command completed with exit code: ${e}`)}});this.log("info","BASH",`Worker ready after command execution (exit code: ${a})`)}async executeMergePr(){await executeMergePr({workingDirectory:this.context.workingDirectory,workClient:this.context.workClient,repositoryId:this.options.input.repositoryId,gitServerId:this.options.input.gitServerId,logger:this.context.logger,askUser:e=>this.askUser(e,{onTimeout:"abort_task"})})}async executeNewSession(){this.log("info","SESSION","Executing new-session: clearing threadId"),this.threadId=null,this.context.workClient.sendResetTaskSession(),this.log("info","SESSION","Session reset sent, stopping task for clean restart"),this.stopTask("event")}async runCodex(){this.log("info","AGENT",`Starting Codex agent for task ${this.taskId}`),this.currentModel=this.options.input.model||null,this.currentModel?this.log("info","AGENT",`Using model: ${this.currentModel}`):this.log("info","AGENT","Using default model from Codex config");const e=this.options.input.agentId??"default",a=(await AgentRunners.create("codex",e)).loop({cwd:this.context.workingDirectory,model:this.currentModel||void 0,agentSessionId:this.threadId??void 0,abortController:this.abortController,modeConfig:{mode:"work",supportChangeTitle:!1}});(async()=>{try{for(;!this.isStopping;){const e=await this.coordinator.waitForAgentMessage();if(e)a.push(e);else if(this.isStopping)break}}catch(e){this.log("error","AGENT","Message pump failed:",e),this.stopTask("event")}})();for await(const e of a.events){if(this.context.logger.debug(`sdk message: ${JSON.stringify(e)}`),"system"===e.type&&"init"===e.subtype){this.threadId=e.session_id,this.context.workClient.sendUpdateTaskAgentSessionId(e.session_id),this.log("info","AGENT",`Thread started: ${e.session_id}`),this.refreshGroupId(),this.updateAgentRunning(!0);continue}const a=this.filterMessages(e);null!==a&&("result"===e.type?await this.handleSdkResultMessage(a):this.context.workClient.sendTaskEvent(this.getChatSenderMeta(),a,{groupId:this.currentGroupId??void 0})),"result"===e.type?this.updateAgentRunning(!1):this.updateAgentRunning(!0)}this.log("info","AGENT",`Codex agent finished for task ${this.taskId}`)}filterMessages(e){const a=e,n=a?.message?.content;if(!n||"string"==typeof n)return e;const t=n.filter(e=>"tool_use"===e.type&&"agentrix"===e.server_name?(this.filteredToolUseIds.add(e.id),!1):!("tool_result"===e.type&&this.filteredToolUseIds.has(e.tool_use_id)||"user"===a.type&&"tool_result"!==e.type));return 0===t.length?null:(a.message.content=t,a)}sendMessage(e){const a={type:"assistant",message:{id:node_crypto.randomUUID().toString(),type:"message",container:null,role:"assistant",content:[{citations:null,type:"text",text:e}],model:this.currentModel||"",usage:{},stop_reason:null,context_management:null,stop_sequence:null},parent_tool_use_id:null,session_id:"",uuid:node_crypto.randomUUID().toString()};this.getActiveWorkClient().sendTaskMessage(this.getChatSenderMeta(),a,{groupId:this.currentGroupId??void 0})}async askUser(e,a={}){const n=this.getActiveWorkClient();return askUserWithTimeout(e,this.askUserAwaiter,{sendAskUser:e=>n.sendAskUser(this.getChatSenderMeta(),e,{groupId:this.currentGroupId??void 0}),sendAskUserResponse:(e,a)=>n.sendAskUserResponse(e,a),onTimeoutMessage:e=>this.sendMessage(e),stopTask:e=>this.stopTask(e)},a)}getActiveWorkClient(){const e=this.context?.workClient??this.workClient;if(!e)throw new Error("[WORKER] WorkerClient not available");return e}resolveTaskAgentName(e){const a=this.options.input.taskAgents??[];return a.find(a=>a.id===e)?.name||""}getChatSenderMeta(){const e=this.options.input.agentId;return{senderType:"agent",senderId:e,senderName:this.resolveTaskAgentName(e)??""}}async onUncommittedChanges(){const e=[{question:"Uncommitted changes detected in the working directory. How would you like to proceed?",header:"Git Status",multiSelect:!1,options:[{label:"Ignore",description:"Keep changes on current branch and continue without switching"},{label:"Commit",description:"Commit on current branch, then switch to task branch"},{label:"Stash",description:"Stash changes, then switch to task branch"},{label:"Abort",description:"Cancel the task, do nothing"}]}];try{const a=(await this.askUser(e,{onTimeout:"abort_task"})).answers[0];return a.startsWith("other:")?(this.log("info","GIT",`User provided custom input: ${a}, defaulting to Abort`),"Abort"):{Ignore:"Ignore",Commit:"Commit",Stash:"Stash",Abort:"Abort"}[a]||"Abort"}catch(e){return this.log("warn","GIT",`Failed to get user response for uncommitted changes: ${e}`),"Abort"}}async onBranchMismatch(e){const a=[{label:"Switch",description:`Checkout ${e.expectedBranch} and continue`},{label:"Keep",description:`Continue on ${e.currentBranch} (may affect task history)`},{label:"Abort",description:"Cancel the task"}],n=[{question:`Branch mismatch detected. Current: ${e.currentBranch}. Expected: ${e.expectedBranch}. How would you like to proceed?`,header:"Git Branch",multiSelect:!1,options:a}];try{const e=(await this.askUser(n,{onTimeout:"abort_task"})).answers[0];return e.startsWith("other:")?(this.log("info","GIT",`User provided custom input: ${e}, defaulting to Abort`),"Abort"):{Switch:"Switch",Keep:"Keep",Abort:"Abort"}[e]||"Abort"}catch(e){return this.log("warn","GIT",`Failed to get user response for branch mismatch: ${e}`),"Abort"}}async createPullRequest(e,a){this.log("info","MERGE",`Creating PR: ${e}`);try{const n=await this.context.workClient.sendMergeRequest(e,a);this.sendMessage(`✅ Pull request created successfully!\nNumber: #${n.pullRequestNumber}\nURL: ${n.pullRequestUrl}`)}catch(e){this.log("error","MERGE","Failed to create PR:",e),this.sendMessage(`❌ Failed to create pull request: ${e instanceof Error?e.message:"Unknown error"}`)}}async convertSDKMessageToCodexInput(e){const a=e.message.content;if("string"==typeof a)return a;if(Array.isArray(a)){const e=[],n=_package.machine.resolveAttachmentsDir(this.options.input.userId,this.taskId);for(const t of a)if("text"===t.type&&t.text)e.push(t.text);else if("image"===t.type&&t.source&&t.source.url){const a=t.source.url;try{const{filePath:t}=await downloadFile(a,n,!1);this.log("info","IMAGE",`Downloaded image from ${a} to ${t}`),e.push(`Image: ${t}`)}catch(e){this.log("error","IMAGE",`Failed to download image from ${a}:`,e)}}else if("document"===t.type&&t.source&&t.source.url){const a=t.source.url;try{const{filePath:s,mimeType:i,filename:o}=await downloadFile(a,n,!0);this.log("info","DOCUMENT",`Downloaded document from ${a} to ${s}`);const r=t.title||o;e.push(`Document: ${s}\nTitle: ${r}\nType: ${i}`)}catch(e){this.log("error","DOCUMENT",`Failed to download document from ${a}:`,e)}}const t=e.map(e=>e.trim()).filter(Boolean).join("\n\n").trim();if(t)return t}return""}stopTask(e){this.isStopping||(this.isStopping=!0,"idle"===e?this.log("info","AGENT","Idle timeout reached, stopping task"):"ask_user_timeout"===e&&this.log("info","AGENT","ask_user timed out, stopping task"),this.askUserAwaiter.clear(),this.coordinator?.stop(),this.abortController.abort())}updateAgentRunning(e){this.coordinator?.updateAgentRunning(e)}createWorkerClientConfig(e,a,n){const t=this.options.input.agentId,s=this.options.input.taskAgents?.find(e=>e.id===t)?.name;return{config:{userId:e,taskId:a,chatId:this.options.input.chatId,machineId:this.credentials.machineId,agentId:t,agentName:s,cwd:n,serverUrl:_package.machine.serverUrl.replace(/^http/,"ws"),path:"/v1/ws",auth:shared.workerAuth(this.credentials.token,this.credentials.machineId,a),dataEncryptionKey:this.dataEncryptionKey,keepAliveConfig:{intervalMs:2e4,event:"worker-alive",payloadGenerator:()=>{const e=this.coordinator?.getStatus(),n="running"===e?.state?"worker-running":"worker-ready";return{eventId:shared.createEventId(),status:n,taskId:a,machineId:this.credentials.machineId,timestamp:Date.now().toString()}}},healthCheckConfig:{enabled:!0,intervalMs:3e4,timeoutMs:5e3},logger:(e,...a)=>(this.context?.logger??this.logger)?.info(`[SOCKET] ${e}`,...a)},handlers:{stopTask:async()=>{this.stopTask("event")},onTaskMessage:async e=>{if(shared.isAskUserResponseMessage(e)){const[a,n]=this.askUserAwaiter.entries().next().value||[];return void(a&&n&&(this.askUserAwaiter.delete(a),n(e)))}shared.isSDKMessage(e)&&"user"===e.type&&await this.coordinator.enqueue(e)},onTaskInfoUpdate:async e=>{applyTaskInfoUpdate(e,this.options.input)},onWorkerStatusRequest:async()=>{if(!this.context?.workClient)return;if(!this.coordinator)return;const{state:e}=this.coordinator.getStatus();"running"===e?this.context.workClient.sendWorkRunning():"idle"===e&&this.context.workClient.sendWorkerReady()}}}}async exitWorker(e,a){this.coordinator&&this.coordinator.stop(),this.log("info","WORKER",`Exiting with status: ${e} for task ${this.taskId}`),"error"===e&&a?await this.context.workClient.sendErrorMessageAndExit(a):(this.context.workClient.sendWorkerExit(e),await this.context.workClient.disconnect()),this.historyDb&&this.historyDb.close()}createLogger(e){const{createLogger:a}=require$$0;return a(e)}log(e,a,n,...t){const s=this.context?.logger??this.logger;s&&s[e](`[${a}] ${n}`,...t)}get taskId(){return this.options.input.taskId}getCurrentModel(){return this.currentModel||"gpt-5"}async handleSdkResultMessage(e){let a,n;try{const e=await this.workspace.prepareResultArtifacts({onCommitError:e=>{this.log("warn","GIT","Failed to auto-commit changes before result message:",e)},onPatchError:e=>{this.log("warn","GIT","Failed to write patch diff for result:",e)}});a=e.artifacts,n=e.currentCommitHash}catch(e){this.log("warn","GIT","Failed to prepare git artifacts for result:",e)}if(this.context.workClient.sendTaskMessage(this.getChatSenderMeta(),e,{...a?{artifacts:a}:{},groupId:this.currentGroupId??void 0}),n)try{await markCommitAsSent(this.options.input.userId,this.taskId,n)}catch(e){this.log("warn","GIT","Failed to mark commit as sent:",e)}}}async function runCodex(e,a){const n=new CodexWorker(e,a);await n.start()}async function copyDirectory(e,a){await fs$1.promises.mkdir(a,{recursive:!0});const n=await fs$1.promises.readdir(e,{withFileTypes:!0});for(const t of n){const n=path$1.join(e,t.name),s=path$1.join(a,t.name);t.isDirectory()?await copyDirectory(n,s):await fs$1.promises.copyFile(n,s)}}function createWorkerClient(e,a,n){const t=_package.machine.serverUrl.replace(/^http/,"ws");return socket_ioClient.io(t,{path:"/v1/ws",transports:["websocket"],auth:{token:e.token,clientType:"worker",machineId:e.machineId,taskId:n}})}async function runDeployment(e,a){const n=a.input,{taskId:t,sourcePath:s,targetAgentId:i,userId:o,name:r,avatar:c,isSystemAgent:p,supportLocal:l}=n;let d=null;try{if(console.log(`[Deployment] Starting deployment worker for task ${t}`),!fs$1.existsSync(s))throw new Error(`Source path not found: ${s}`);const a=path$1.join(_package.machine.agentrixAgentsHomeDir,i);if(fs$1.existsSync(a))throw new Error(`Target agent directory already exists: ${a}`);console.log(`[Deployment] Copying from ${s} to ${a}`),await copyDirectory(s,a),console.log("[Deployment] Deployment completed successfully"),d=createWorkerClient(e,o,t),await new Promise((e,a)=>{const n=setTimeout(()=>{a(new Error("WebSocket connection timeout"))},1e4);d.on("connect",()=>{clearTimeout(n),console.log("[Deployment] Connected to server"),d.emit("deploy-agent-complete",{eventId:shared.createEventId(),taskId:t,targetAgentId:i,success:!0,name:r,avatar:c,isSystemAgent:p,supportLocal:l}),console.log("[Deployment] Sent deploy-agent-complete event"),setTimeout(()=>{e()},1e3)}),d.on("connect_error",e=>{clearTimeout(n),a(e)})})}catch(e){throw console.error("[Deployment] Deployment failed:",e),d&&d.connected&&(d.emit("deploy-agent-complete",{eventId:shared.createEventId(),taskId:t,targetAgentId:i,success:!1,error:e instanceof Error?e.message:String(e)}),await new Promise(e=>setTimeout(e,1e3))),e}finally{d&&d.disconnect(),process.exit(0)}}async function runCompanion(e,a){const{agentDir:n,homeDir:t}=await ensureCompanionAgent();a.input.agentDir=n,process.env.AGENTRIX_COMPANION_HOME=t;const s=buildWorkspaceOptions(a.input),i=await CwdCalculator.calculateFinalCwd(s),o=new ClaudeWorker(e,a,i);await o.start()}const workerTypes=["claude","codex","deployment","companion"],workerRegistry={claude:{async run({credentials:e,startedBy:a,userId:n,taskId:t,idleTimeoutSecond:s}){const i=_package.machine.readTaskInput(n,t),o=i.dataEncryptionKey?shared.decodeBase64(i.dataEncryptionKey):null;if(o&&32!==o.length)throw new Error("Invalid dataEncryptionKey: expected decrypted 32-byte key");const r={startedBy:a,idleTimeoutSecond:s,input:i,dataEncryptionKey:o};await runClaude(e,r)}},codex:{async run({credentials:e,startedBy:a,userId:n,taskId:t,idleTimeoutSecond:s}){const i=_package.machine.readTaskInput(n,t),o=i.dataEncryptionKey?shared.decodeBase64(i.dataEncryptionKey):null;if(o&&32!==o.length)throw new Error("Invalid dataEncryptionKey: expected decrypted 32-byte key");const r={startedBy:a,idleTimeoutSecond:s,input:i,dataEncryptionKey:o};await runCodex(e,r)}},deployment:{async run({credentials:e,startedBy:a,userId:n,taskId:t,idleTimeoutSecond:s}){const i={input:_package.machine.readTaskInput(n,t)};await runDeployment(e,i)}},companion:{async run({credentials:e,startedBy:a,userId:n,taskId:t,idleTimeoutSecond:s}){const i=_package.machine.readTaskInput(n,t),o=i.dataEncryptionKey?shared.decodeBase64(i.dataEncryptionKey):null;if(o&&32!==o.length)throw new Error("Invalid dataEncryptionKey: expected decrypted 32-byte key");const r={startedBy:a,idleTimeoutSecond:s,input:i,dataEncryptionKey:o};await runCompanion(e,r)}}};async function checkForUpgrades(){const e=_package.packageJson.version;try{const a=child_process.execSync("npm view @agentrix/cli version",{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}).trim();return{hasUpgrade:compareVersions(a,e)>0,currentVersion:e,latestVersion:a}}catch(a){return{hasUpgrade:!1,currentVersion:e,latestVersion:null}}}function compareVersions(e,a){const n=e.split(".").map(Number),t=a.split(".").map(Number);for(let e=0;e<Math.max(n.length,t.length);e++){const a=n[e]||0,s=t[e]||0;if(a>s)return 1;if(a<s)return-1}return 0}function displayUpgradeNotification(e){e.hasUpgrade&&e.latestVersion&&(console.log(""),console.log(chalk.yellow("┌────────────────────────────────────────────────────┐")),console.log(chalk.yellow("│")+" "+chalk.bold("Upgrade Available")+" "+chalk.yellow("│")),console.log(chalk.yellow("│")+" "+chalk.yellow("│")),console.log(chalk.yellow("│")+` Current: ${chalk.dim(e.currentVersion)} → Latest: ${chalk.green.bold(e.latestVersion)} `+chalk.yellow("│")),console.log(chalk.yellow("│")+" "+chalk.yellow("│")),console.log(chalk.yellow("│")+" Run "+chalk.cyan.bold("agentrix upgrade")+" to upgrade "+chalk.yellow("│")),console.log(chalk.yellow("│")+" "+chalk.yellow("│")),console.log(chalk.yellow("│")+" To enable auto-upgrade, set: "+chalk.yellow("│")),console.log(chalk.yellow("│")+" "+chalk.dim("AGENTRIX_DISABLE_AUTO_UPGRADE=false")+" "+chalk.yellow("│")),console.log(chalk.yellow("└────────────────────────────────────────────────────┘")),console.log(""))}function isAutoUpgradeDisabled(){return"true"===process.env.AGENTRIX_DISABLE_AUTO_UPGRADE}async function performAutoUpgrade(e){try{const{execSync:a}=await import("child_process");return console.log(""),e||(console.log(chalk.blue("🔄 Checking for upgrades...")),e=await checkForUpgrades()),e.hasUpgrade?(console.log(chalk.blue(`🔄 Upgrading from ${e.currentVersion} to ${e.latestVersion}...`)),a("npm install -g @agentrix/cli@latest",{stdio:"inherit"}),console.log(chalk.green("✓ Upgrade complete")),console.log(""),!0):(console.log(chalk.green("✓ Already on latest version")),console.log(""),!0)}catch(e){return console.log(""),console.log(chalk.yellow("⚠️ Auto-upgrade failed")),console.log(chalk.dim(" You can upgrade manually with: npm install -g @agentrix/cli@latest")),console.log(""),!1}}const UPGRADE_CHECK_INTERVAL=216e5;function getUpgradeDaemonStatePath(){const e=_package.machine.getStatePaths();return path.join(path.dirname(e.daemonStateFile),"upgrade-daemon.state.json")}function readUpgradeDaemonState(){try{const e=getUpgradeDaemonStatePath();if(!fs.existsSync(e))return null;const a=fs.readFileSync(e,"utf-8");return JSON.parse(a)}catch{return null}}function writeUpgradeDaemonState(e){const a=getUpgradeDaemonStatePath();fs.writeFileSync(a,JSON.stringify(e,null,2))}function deleteUpgradeDaemonState(){try{const e=getUpgradeDaemonStatePath();fs.existsSync(e)&&fs.unlinkSync(e)}catch{}}function isProcessRunning(e){try{return process.kill(e,0),!0}catch{return!1}}function isUpgradeDaemonRunning(){const e=readUpgradeDaemonState();return!(!e||!isProcessRunning(e.pid)&&(deleteUpgradeDaemonState(),1))}function stopUpgradeDaemon(){const e=readUpgradeDaemonState();if(e)try{isProcessRunning(e.pid)&&process.kill(e.pid,"SIGTERM")}catch{}finally{deleteUpgradeDaemonState()}}async function checkAndUpgrade(){if(isAutoUpgradeDisabled())return!1;const e=await checkForUpgrades();return!(!e.hasUpgrade||!await performAutoUpgrade(e))&&(await stopDaemon(),await new Promise(e=>setTimeout(e,1e3)),spawnAgentrixCLI(["daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref(),!0)}async function runUpgradeDaemonLoop(){writeUpgradeDaemonState({pid:process.pid,startedAt:(new Date).toISOString()}),process.on("SIGTERM",()=>{deleteUpgradeDaemonState(),process.exit(0)}),process.on("SIGINT",()=>{deleteUpgradeDaemonState(),process.exit(0)});try{await checkAndUpgrade()}catch(e){}for(;;){await new Promise(e=>setTimeout(e,216e5));try{await checkAndUpgrade()}catch(e){}}}async function startUpgradeDaemon(){await runUpgradeDaemonLoop()}var upgradeDaemon=Object.freeze({__proto__:null,isUpgradeDaemonRunning:isUpgradeDaemonRunning,startUpgradeDaemon:startUpgradeDaemon,stopUpgradeDaemon:stopUpgradeDaemon});const cli=yargs(helpers.hideBin(process.argv)).scriptName("agentrix").version(_package.packageJson.version).usage("$0 <command> [options]").option("debug",{alias:"d",type:"boolean",describe:"Use local-debug mode (plaintext, for debugging)",global:!0}).help("help").alias("h","help").alias("v","version").strict().epilog("For more information, visit https://github.com/xmz-ai/agentrix-cli");_package.machine.getStatePaths,cli.command("upgrade","Upgrade CLI to the latest version",{},async e=>{console.log(chalk.dim(`Current version: ${_package.packageJson.version}`));const a=await checkIfDaemonRunningAndCleanupStaleState();if(await performAutoUpgrade()||process.exit(1),a){console.log(chalk.blue("Restarting daemon...")),await stopDaemon(),await new Promise(e=>setTimeout(e,1e3)),spawnAgentrixCLI(["daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref();let e=!1;for(let a=0;a<50;a++)if(await new Promise(e=>setTimeout(e,100)),await checkIfDaemonRunningAndCleanupStaleState()){e=!0;break}e?console.log(chalk.green("✓ Daemon restarted successfully")):console.log(chalk.yellow("⚠️ Daemon may still be starting. Run 'agentrix status' to check."))}try{const{version:e}=await Promise.resolve().then(function(){return require("./logger-BrStDlXM.cjs")}).then(function(e){return e._package});console.log(chalk.green(`\n✓ Now running version: ${e}`))}catch{console.log(chalk.dim("\nRun 'agentrix --version' to see the new version"))}process.exit(0)}),cli.command("doctor","System diagnostics & troubleshooting",{},async e=>{await runDoctorCommand(),process.exit(0)}),cli.command("logout","Logout from Agentrix",{},async e=>{try{await handleAuthLogout()}catch(e){console.error(chalk.red("Error:"),e instanceof Error?e.message:"Unknown error"),process.env.DEBUG&&console.error(e),process.exit(1)}process.exit(0)}),cli.command("stop","Stop the daemon",{},async e=>{stopUpgradeDaemon(),await stopDaemon(),process.exit(0)}),cli.command("status","Show daemon and authentication status",{},async e=>{await runDoctorCommand("daemon"),console.log(""),await handleAuthStatus(),process.exit(0)}),cli.command("ls","List active sessions",{},async e=>{try{const e=await listDaemonSessions();0===e.length?console.log("No active sessions"):(console.log("Active sessions:"),console.log(JSON.stringify(e,null,2)))}catch(e){console.log("No daemon running")}process.exit(0)}),cli.command("killall","Clean up all runaway agentrix processes",{},async()=>{const e=await killRunawayAgentrixProcesses();console.log(`Cleaned up ${e.killed} runaway processes`),e.errors.length>0&&console.log("Errors:",e.errors),process.exit(0)}),cli.command("kill <sessionId>","Stop a specific session",e=>e.positional("sessionId",{type:"string",describe:"Session ID to stop"}),async e=>{try{const a=await stopDaemonSession(e.sessionId);console.log(a?chalk.green("✓ Session stopped"):chalk.red("Failed to stop session"))}catch(e){console.log(chalk.red("No daemon running"))}process.exit(0)}),cli.command("daemon",!1,{},async e=>{try{await authAndSetupMachineIfNeeded()}catch(e){console.error(chalk.red("Error:"),e instanceof Error?e.message:"Authentication failed"),process.env.DEBUG&&console.error(e),process.exit(1)}await startDaemon(),process.exit(0)}),cli.command("worker",!1,e=>e.option("type",{type:"string",choices:workerTypes,demandOption:!0,describe:"Worker type to start"}).option("started-by",{type:"string",choices:["daemon","terminal"],describe:"How the session was started"}).option("user-id",{type:"string",demandOption:!0,describe:"User ID for the worker"}).option("task-id",{type:"string",demandOption:!0,describe:"Task ID for the worker"}).option("idle-timeout",{type:"number",default:300,describe:"Idle timeout in seconds"}),async e=>{try{const a=e.type,n=workerRegistry[a];if(!n)throw new Error(`Unsupported worker type: ${String(e.type)}`);const t=e["started-by"],s=await authAndSetupMachineIfNeeded(),i=e["user-id"],o=e["task-id"],r=e["idle-timeout"];await n.run({credentials:s,startedBy:t,userId:i,taskId:o,idleTimeoutSecond:r})}catch(e){console.error(chalk.red("Error:"),e instanceof Error?e.message:"Unknown error"),process.env.DEBUG&&console.error(e),process.exit(1)}}),cli.command("upgrade-daemon",!1,{},async e=>{const{startUpgradeDaemon:a}=await Promise.resolve().then(function(){return upgradeDaemon});await a(),process.exit(0)}),cli.command("start","Start daemon (if not running) and show status",{},async e=>{try{await authAndSetupMachineIfNeeded()}catch(e){console.error(chalk.red("Error:"),e instanceof Error?e.message:"Authentication failed"),process.env.DEBUG&&console.error(e),process.exit(1)}const a=checkCriticalDependencies();if(a.ok||(console.log(chalk.bold.red("\n⚠️ Missing Critical Dependencies")),console.log(chalk.yellow(`Cannot start daemon. Missing: ${a.missing.join(", ")}`)),console.log(chalk.blue('\nRun "agentrix doctor" for detailed dependency information and installation instructions.')),process.exit(1)),!await isLatestDaemonRunning()){console.log("Starting Agentrix background service..."),spawnAgentrixCLI(["daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref();let e=!1;for(let a=0;a<50;a++)if(await new Promise(e=>setTimeout(e,100)),await checkIfDaemonRunningAndCleanupStaleState()){e=!0;break}e?console.log(chalk.green("✓ Daemon started successfully")):console.log(chalk.yellow("⚠️ Daemon may still be starting..."))}if(isAutoUpgradeDisabled()){const e=await checkForUpgrades();e.hasUpgrade&&displayUpgradeNotification(e)}else isUpgradeDaemonRunning()||spawnAgentrixCLI(["upgrade-daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref();await runDoctorCommand("daemon"),process.exit(0)}),cli.demandCommand(1,"Please specify a command. Use --help to see available commands.").parse();