@agentrix/cli 0.8.0 → 0.9.0
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 +1 -1
- package/dist/index.mjs +1 -1
- package/dist/lib.cjs +1 -1
- package/dist/lib.mjs +1 -1
- package/dist/logger-DfAmMJK4.cjs +1 -0
- package/dist/logger-gqEfOYLW.mjs +1 -0
- package/package.json +7 -4
- package/dist/companion/template/common/agent.json +0 -5
- package/dist/companion/template/common/claude/config.json +0 -8
- package/dist/companion/template/common/claude/system_prompt.md +0 -300
- package/dist/companion/template/languages/en/claude/BOOTSTRAP.md +0 -34
- package/dist/companion/template/languages/en/claude/HEARTBEAT.md +0 -19
- package/dist/companion/template/languages/en/claude/IDENTITY.md +0 -15
- package/dist/companion/template/languages/en/claude/MEMORY.md +0 -3
- package/dist/companion/template/languages/en/claude/SKILLS.md +0 -7
- package/dist/companion/template/languages/en/claude/SOUL.md +0 -28
- package/dist/companion/template/languages/en/claude/USER.md +0 -8
- package/dist/companion/template/languages/en/claude/skills/subagent.md +0 -34
- package/dist/companion/template/languages/zh-Hans/claude/BOOTSTRAP.md +0 -34
- package/dist/companion/template/languages/zh-Hans/claude/HEARTBEAT.md +0 -19
- package/dist/companion/template/languages/zh-Hans/claude/IDENTITY.md +0 -15
- package/dist/companion/template/languages/zh-Hans/claude/MEMORY.md +0 -3
- package/dist/companion/template/languages/zh-Hans/claude/SKILLS.md +0 -7
- package/dist/companion/template/languages/zh-Hans/claude/SOUL.md +0 -28
- package/dist/companion/template/languages/zh-Hans/claude/USER.md +0 -8
- package/dist/companion/template/versions/common.json +0 -15
- package/dist/companion/template/versions/en.json +0 -36
- package/dist/companion/template/versions/zh-Hans.json +0 -31
- package/dist/logger-BNXbkPSk.mjs +0 -1
- package/dist/logger-C-pD9ljO.cjs +0 -1
- package/dist/template/common/agent.json +0 -5
- package/dist/template/common/claude/config.json +0 -8
- package/dist/template/common/claude/system_prompt.md +0 -300
- package/dist/template/languages/en/claude/BOOTSTRAP.md +0 -34
- package/dist/template/languages/en/claude/HEARTBEAT.md +0 -19
- package/dist/template/languages/en/claude/IDENTITY.md +0 -15
- package/dist/template/languages/en/claude/MEMORY.md +0 -3
- package/dist/template/languages/en/claude/SKILLS.md +0 -7
- package/dist/template/languages/en/claude/SOUL.md +0 -28
- package/dist/template/languages/en/claude/USER.md +0 -8
- package/dist/template/languages/en/claude/skills/subagent.md +0 -34
- package/dist/template/languages/zh-Hans/claude/BOOTSTRAP.md +0 -34
- package/dist/template/languages/zh-Hans/claude/HEARTBEAT.md +0 -19
- package/dist/template/languages/zh-Hans/claude/IDENTITY.md +0 -15
- package/dist/template/languages/zh-Hans/claude/MEMORY.md +0 -3
- package/dist/template/languages/zh-Hans/claude/SKILLS.md +0 -7
- package/dist/template/languages/zh-Hans/claude/SOUL.md +0 -28
- package/dist/template/languages/zh-Hans/claude/USER.md +0 -8
- package/dist/template/versions/common.json +0 -15
- package/dist/template/versions/en.json +0 -36
- package/dist/template/versions/zh-Hans.json +0 -31
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{createRequire as e}from"node:module";const n=e(import.meta.url);import t from"yargs";import{hideBin as a}from"yargs/helpers";import s from"chalk";import{encodeBase64 as i,createKeyPairWithUit8Array as o,encryptMachineEncryptionKey as r,generateAESKey as c,decodeBase64 as p,decryptWithEphemeralKey as l,createEventId as d,encryptFileContent as u,splitRtcChunkFrame as m,RtcChunkFlags as g,buildRtcChunkFrame as h,decryptSdkMessage as f,machineAuth as x,encryptSdkMessage as v,isSDKUserMessage as b,isAskUserMessage as y,isAskUserResponseMessage as w,isSDKMessage as k,decodeGitPath as I,getAgentContext as S,detectPreview as T,IGNORED_DIRECTORIES as C,isCompanionHeartbeatMessage as E,isCompanionReminderMessage as A,workerAuth as M}from"@agentrix/shared";import{randomBytes as P,createDecipheriv as R,randomUUID as $,createHash as _}from"node:crypto";import D from"axios";import{m as N,l as O,p as j,a as q,c as U,g as G,b as L}from"./logger-BNXbkPSk.mjs";import{createInterface as W}from"node:readline";import*as F from"fs";import H,{readFileSync as B,existsSync as z,promises as K}from"fs";import*as V from"path";import X,{join as J,dirname as Y}from"path";import Q,{tmpdir as Z,homedir as ee}from"node:os";import ne from"open";import{io as te}from"socket.io-client";import{EventEmitter as ae}from"node:events";import*as se from"node:fs";import ie,{existsSync as oe,readFileSync as re,statSync as ce,writeFileSync as pe,mkdirSync as le,readdirSync as de,renameSync as ue,rmSync as me,createWriteStream as ge,unlinkSync as he}from"node:fs";import*as fe from"node:path";import xe,{join as ve,dirname as be,basename as ye,relative as we,normalize as ke,extname as Ie,isAbsolute as Se,resolve as Te}from"node:path";import{createRequire as Ce}from"node:module";import{spawn as Ee,execSync as Ae}from"child_process";import Me from"ps-list";import Pe from"cross-spawn";import{getPlatform as Re}from"@xmz-ai/sandbox-runtime/dist/utils/platform.js";import $e from"fastify";import{z as _e,toJSONSchema as De}from"zod";import{validatorCompiler as Ne,serializerCompiler as Oe}from"fastify-type-provider-zod";import{spawnSync as je,execSync as qe,execFile as Ue}from"node:child_process";import{fileURLToPath as Ge}from"node:url";import{EventEmitter as Le}from"events";import We from"better-sqlite3";import{fileURLToPath as Fe,pathToFileURL as He}from"url";import{isSupportedPlatform as Be,NetworkManager as ze,SandboxManager as Ke}from"@xmz-ai/sandbox-runtime";import{pipeline as Ve}from"node:stream/promises";import{tool as Xe,createSdkMcpServer as Je,query as Ye,AbortError as Qe}from"@anthropic-ai/claude-agent-sdk";import Ze from"simple-git";import{promisify as en}from"node:util";import{mkdir as nn,writeFile as tn,readFile as an}from"node:fs/promises";import{randomUUID as sn}from"crypto";import{replacePromptPlaceholders as on,loadAgentConfig as rn,getAgentContext as cn}from"@agentrix/shared/node";import{Codex as pn}from"@openai/codex-sdk";import"winston";import"os";async function ln(e){return new Promise(n=>setTimeout(n,e))}async function dn(e,n){const t=await N.readDaemonState();if(!t?.port){const e="No daemon running, no state file found";return O.debug(`[CONTROL CLIENT] ${e}`),{error:e}}try{const a=process.env.AGENTRIX_DAEMON_HTTP_TIMEOUT?parseInt(process.env.AGENTRIX_DAEMON_HTTP_TIMEOUT):1e4,s=await fetch(`http://agentrix-local.xmz.ai:${t.port}${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n||{}),signal:AbortSignal.timeout(a)});if(!s.ok){const n=`Request failed: ${e}, HTTP ${s.status}`;return O.debug(`[CONTROL CLIENT] ${n}`),{error:n}}return await s.json()}catch(n){const t=`Request failed: ${e}, ${n instanceof Error?n.message:"Unknown error"}`;return O.debug(`[CONTROL CLIENT] ${t}`),{error:t}}}async function un(e,n){return await dn("/session-started",{sessionId:e,metadata:n})}async function mn(){const e=await N.readDaemonState();if(!e)return!1;try{return process.kill(e.pid,0),!0}catch{return O.debug("[DAEMON RUN] Daemon PID not running, cleaning up state"),await hn(),!1}}async function gn(){if(O.debug("[DAEMON CONTROL] Checking if daemon is running same version"),!await mn())return O.debug("[DAEMON CONTROL] No daemon running, returning false"),!1;const e=await N.readDaemonState();if(!e)return O.debug("[DAEMON CONTROL] No daemon state found, returning false"),!1;try{const n=J(j(),"package.json"),t=JSON.parse(B(n,"utf-8")).version;return O.debug(`[DAEMON CONTROL] Current CLI version: ${t}, Daemon started with version: ${e.cliVersion}`),t===e.cliVersion}catch(e){return O.debug("[DAEMON CONTROL] Error checking daemon version",e),!1}}async function hn(){try{await N.clearDaemonState(),O.debug("[DAEMON RUN] Daemon state file removed")}catch(e){O.debug("[DAEMON RUN] Error cleaning up daemon metadata",e)}}async function fn(){try{const e=await N.readDaemonState();if(!e)return void O.debug("No daemon state found");O.debug(`Stopping daemon with PID ${e.pid}`);try{return await async function(){await dn("/stop")}(),void await async function(e){const n=Date.now();for(;Date.now()-n<2e3;)try{process.kill(e,0),await new Promise(e=>setTimeout(e,100))}catch{return}throw new Error("Process did not die within timeout")}(e.pid)}catch(e){O.debug("HTTP stop failed, will force kill",e)}process.kill(e.pid,"SIGKILL")}catch(e){O.debug("Error stopping daemon",e)}}function xn(e){return`${e}\nRun \`agentrix logout\` and bind this machine again.`}function vn(e,n){if(D.isAxiosError(e)){const t=e.response?.data?.message;return"string"==typeof t&&t.length>0?t.includes("Machine binding revoked")?xn(t):`${n}: ${t}`:"string"==typeof e.message&&e.message.includes("Machine binding revoked")?xn(e.message):`${n}: ${e.message}`}return e instanceof Error&&e.message.includes("Machine binding revoked")?xn(e.message):e instanceof Error?`${n}: ${e.message}`:n}async function bn(){const e=await N.readCredentials();if(e)return await async function(e){try{await D.get(`${N.serverUrl}/v1/machines/validate`,{headers:{Authorization:`Bearer ${e.token}`},timeout:15e3})}catch(e){throw new Error(vn(e,"Stored machine credentials are no longer valid"))}}(e),O.info("[AUTH] Using existing credentials"),e;const n=process.env.CLOUD_AUTH_TOKEN,t=process.env.CLOUD_DEVICE;let a,s,d;if(n&&t)a={token:n,machineId:t},O.info("[AUTH] Cloud mode detected, using CLOUD_AUTH_TOKEN");else{const e=await async function(){console.clear();const e=N.generateMachineId(),n=new Uint8Array(P(32)),t=await o(n);try{console.log(`[AUTH] Sending auth request to: ${N.serverUrl}/v1/auth/machine`),console.log(`[AUTH] Public key: ${i(t.publicKey).substring(0,20)}...`);const n={machineId:e};await D.post(`${N.serverUrl}/v1/auth/machine`,n),console.log("[AUTH] Auth request sent successfully")}catch(e){return console.log(vn(e,"Failed to create authentication request, please try again later.")),{credentials:null,userPublicKey:null,keypair:t}}const a=await async function(e,n){console.clear(),console.log("\nWeb Authentication\n");const t=function(e,n){const t={key:i(e,"base64"),machineId:n},a=JSON.stringify(t),s=i((new TextEncoder).encode(a),"base64url");return`${N.webappUrl}/terminal/connect?auth=${s}`}(e.publicKey,n);return console.log("Opening your browser..."),await async function(e){try{return!process.stdout.isTTY||process.env.CI||process.env.HEADLESS?(O.debug("[browser] Headless environment detected, skipping browser open"),!1):(O.debug(`[browser] Attempting to open URL: ${e}`),await ne(e),O.debug("[browser] Browser opened successfully"),!0)}catch(e){return O.debug("[browser] Failed to open browser:",e),!1}}(t)?(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(t),console.log(""),await async function(e,n){process.stdout.write("Waiting for authentication");let t=0,a=!1;const s=()=>{a=!0,console.log("\n\nAuthentication cancelled."),process.exit(0)};process.on("SIGINT",s);try{for(;!a;){try{const t=await D.get(`${N.serverUrl}/v1/auth/machine?machineId=${n}`);if("authorized"===t.data.state){const n=t.data.token,a=t.data.content,s=l(p(a),e.secretKey);return s?{token:n,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\n${vn(e,"Failed to check authentication status. Please try again.")}`),{token:null,userPublicKey:null}}process.stdout.write("\rWaiting for authentication"+".".repeat(t%3+1)+" "),t++,await ln(1e3)}}finally{process.off("SIGINT",s)}return{token:null,userPublicKey:null}}(e,n)}(t,e);return a.token?{credentials:{token:a.token,secret:i(n),machineId:e},userPublicKey:a?.userPublicKey,keypair:t}:{credentials:null,userPublicKey:null,keypair:t}}();if(!e.credentials||!e.userPublicKey)throw new Error("Authentication failed or was cancelled");a=e.credentials,s=e.keypair,d=e.userPublicKey}return await N.writeCredentials(a),await async function(e,n,t,a){try{const s={id:e.machineId,metadata:JSON.stringify(n)};a&&t&&(s.dataEncryptionKey=r(a.publicKey,c(),p(t))),await D.post(`${N.serverUrl}/v1/machines/sync`,s,{headers:{Authorization:`Bearer ${e.token}`,"Content-Type":"application/json"},timeout:6e4})}catch(e){throw new Error(vn(e,"Failed to sync machine data"))}}(a,N.metadata(),d,s),O.info("[AUTH] Machine setup completed"),a}class yn{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 wn{socket=null;config;eventHandlers=new Map;eventEmitter=new ae;KeepAliveManager=null;healthCheckInterval=null;constructor(e){this.config=e,e.keepAliveConfig&&(this.KeepAliveManager=new yn(e.keepAliveConfig))}connect(){if(this.socket)return void this.log("Already connected or connecting");const{serverUrl:e,path:n,auth:t={},options:a={}}=this.config,s={path:n,auth:t,transports:["websocket"],reconnection:!0,reconnectionDelay:1e3,reconnectionDelayMax:5e3,reconnectionAttempts:1/0,...a};this.socket=te(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,n,t){this.socket&&(n&&this.socket.off(e,n),this.socket.on(e,t))}onEvent(e,n){const t=async t=>(this.log(`received event ${e}, data: ${JSON.stringify(t)}`),n(t)),a=this.eventHandlers.get(e);this.eventHandlers.set(e,t),this.replaceSocketHandler(e,a,t)}onEventWithAck(e,n){const t=async(t,a)=>(this.log(`received event with ack ${e}, data: ${JSON.stringify(t)}`),n(t,a)),a=this.eventHandlers.get(e);this.eventHandlers.set(e,t),this.replaceSocketHandler(e,a,t)}unregisterHandler(e){this.eventHandlers.delete(e),this.socket&&this.socket.off(e)}send(e,n){this.socket?(this.log(`send event ${e}`),void 0!==n?this.socket.emit(e,n):this.socket.emit(e)):this.log("Cannot send - socket not connected")}async sendWithAck(e,n){if(!this.socket)throw new Error("Cannot send - socket not connected");return this.log(`send event ${e}, data: ${JSON.stringify(n)}`),this.socket.emitWithAck(e,n)}sendVolatile(e,n){this.socket&&(void 0!==n?this.socket.volatile.emit(e,n):this.socket.volatile.emit(e))}async flush(e=1e4){if(this.connected)return new Promise(n=>{const t=setTimeout(()=>n(),e);this.socket.emit("ping",()=>{clearTimeout(t),n()})})}updateAuth(e){this.socket&&(this.socket.auth=e),this.config.auth=e}onLifecycle(e,n){this.eventEmitter.on(`lifecycle:${e}`,n)}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,n]of this.eventHandlers.entries())this.socket.off(e,n),this.socket.on(e,n);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:",function(e){if(!e||"object"!=typeof e)return String(e??"unknown error");const n=e,t=[];return n.message&&t.push(n.message),n.type&&t.push(`type=${n.type}`),void 0!==n.description&&t.push(`description=${JSON.stringify(n.description)}`),void 0!==n.data&&t.push(`data=${JSON.stringify(n.data)}`),void 0!==n.context&&t.push(`context=${JSON.stringify(n.context)}`),t.filter(Boolean).join(" ")||"unknown socket error"}(e)),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 n=e?.intervalMs??3e4,t=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())},t);this.socket.once("pong",()=>{clearTimeout(e)}),this.socket.emit("ping")},n)}stopHealthCheck(){this.healthCheckInterval&&(clearInterval(this.healthCheckInterval),this.healthCheckInterval=null)}log(e,...n){this.config.logger&&this.config.logger(`[SocketClient] ${e}`,...n)}}function kn(e){if(Object.prototype.hasOwnProperty.call(e,"__esModule"))return e;var n=e.default;if("function"==typeof n){var t=function e(){var t=!1;try{t=this instanceof e}catch{}return t?Reflect.construct(n,arguments,this.constructor):n.apply(this,arguments)};t.prototype=n.prototype}else t={};return Object.defineProperty(t,"__esModule",{value:!0}),Object.keys(e).forEach(function(n){var a=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,a.get?a:{enumerable:!0,get:function(){return e[n]}})}),t}var In,Sn,Tn,Cn,En,An={},Mn={"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 Pn(){if(Cn)return Tn;Cn=1;var e={"prs.":100,"x-":200,"x.":300,"vnd.":400,default:900},n={nginx:10,apache:20,iana:40,default:30},t={application:1,font:2,audio:2,video:3,default:0};return Tn=function(a,s="default"){if("application/octet-stream"===a)return 0;const[i,o]=a.split("/"),r=o.replace(/(\.|x-).*/,"$1");return(e[r]||e.default)+(n[s]||n.default)+(t[i]||t.default)+(1-a.length/100)}}var Rn=(En||(En=1,function(e){var n,t,a=Sn?In:(Sn=1,In=Mn),s=X.extname,i=Pn(),o=/^\s*([^;\s]*)(?:;|\s|$)/,r=/^text\//i;function c(e){if(!e||"string"!=typeof e)return!1;var n=o.exec(e),t=n&&a[n[1].toLowerCase()];return t&&t.charset?t.charset:!(!n||!r.test(n[1]))&&"UTF-8"}function p(n){if(!n||"string"!=typeof n)return!1;var t=o.exec(n),a=t&&e.extensions[t[1].toLowerCase()];return!(!a||!a.length)&&a[0]}function l(e,n,t){return(n?i(n,a[n].source):0)>(t?i(t,a[t].source):0)?n:t}function d(n,t,s){var i=["nginx","apache",void 0,"iana"],o=t?i.indexOf(a[t].source):0,r=s?i.indexOf(a[s].source):0;return"application/octet-stream"!==e.types[p]&&(o>r||o===r&&"application/"===e.types[p]?.slice(0,12))||o>r?t:s}e.charset=c,e.charsets={lookup:c},e.contentType=function(n){if(!n||"string"!=typeof n)return!1;var t=-1===n.indexOf("/")?e.lookup(n):n;if(!t)return!1;if(-1===t.indexOf("charset")){var a=e.charset(t);a&&(t+="; charset="+a.toLowerCase())}return t},e.extension=p,e.extensions=Object.create(null),e.lookup=function(n){if(!n||"string"!=typeof n)return!1;var t=s("x."+n).toLowerCase().slice(1);return t&&e.types[t]||!1},e.types=Object.create(null),e._extensionConflicts=[],n=e.extensions,t=e.types,Object.keys(a).forEach(function(s){var i=a[s].extensions;if(i&&i.length){n[s]=i;for(var o=0;o<i.length;o++){var r=i[o];t[r]=l(0,t[r],s);const n=d(0,t[r],s);n!==t[r]&&e._extensionConflicts.push([r,n,t[r]])}}})}(An)),An);function $n(e,n){e?e.send("workspace-file-response",n):O.error("[WORKSPACE] Cannot send workspace-file-response: client not available")}function _n(e,n,t,a){return{eventId:d(),requestId:e,taskId:n,success:!1,error:{code:t,message:a}}}function Dn(e){return async n=>{const{taskId:t,userId:a,relativePath:s,requestId:i,maxFileSizeMB:o,ifModifiedSince:r,dataEncryptionKey:c}=n;O.debug(`[WORKSPACE] File request: taskId=${t}, userId=${a}, relativePath=${s}, maxFileSizeMB=${o}, ifModifiedSince=${r}, hasEncryptionKey=${!!c}`);try{const n=1024*(o||10)*1024,m=function(e,n,t){return N.resolveWorkspaceFilePath(e,n,t)}(a,t,s);if(!se.existsSync(m))return O.warn(`[WORKSPACE] File not found: ${m}`),void $n(e.client,_n(i,t,"file_not_found","File or directory not found"));const g=await se.promises.stat(m),h=g.mtime.toISOString();if(r&&h===r)return void function(e,n,t,a){O.debug(`[WORKSPACE] File not modified: ${a}`),$n(e,{eventId:d(),requestId:n,taskId:t,success:!0,notModified:!0})}(e.client,i,t,m);if(g.isDirectory())return void await async function(e,n,t,a,s,i){const o=await se.promises.readdir(a,{withFileTypes:!0}),r=await Promise.all(o.map(async e=>{const n=fe.join(a,e.name),t=await se.promises.stat(n);return{name:e.name,type:e.isDirectory()?"directory":"file",size:t.size,modifiedAt:t.mtime.toISOString(),accessDenied:t.size>i}}));$n(e,{eventId:d(),requestId:n,taskId:t,success:!0,data:{type:"directory",entries:r,metadata:{size:0,modifiedAt:s.mtime.toISOString()}}})}(e.client,i,t,m,g,n);{const a=Rn.lookup(m)||"application/octet-stream";return g.size>n?void function(e,n,t,a,s,i,o){O.warn(`[WORKSPACE] File too large (${s.size} bytes > ${o} bytes): ${a}`),$n(e,{eventId:d(),requestId:n,taskId:t,success:!0,data:{type:"file",metadata:{size:s.size,mimeType:i,modifiedAt:s.mtime.toISOString(),accessDenied:!0}}})}(e.client,i,t,m,g,a,n):void await async function(e,n,t,a,s,i){const o=Rn.lookup(a)||"application/octet-stream",r=(await se.promises.readFile(a)).toString("base64");let c=null;i&&(c=await async function(e){try{const n=await N.getSecretKey();if(!n)return O.warn("[WORKSPACE] Machine secret key not available"),null;const t=p(e);return l(t,n)||(O.warn("[WORKSPACE] Failed to decrypt dataEncryptionKey"),null)}catch(e){return O.warn("[WORKSPACE] Error decrypting dataEncryptionKey:",e),null}}(i));const m={type:"file",metadata:{size:s.size,mimeType:o,modifiedAt:s.mtime.toISOString()}};c?m.encryptedContent=u(r,c):m.content=r,$n(e,{eventId:d(),requestId:n,taskId:t,success:!0,data:m})}(e.client,i,t,m,g,c)}}catch(n){O.error(`[WORKSPACE] Failed to handle workspace-file-request: ${n.message}`,n);const a="ENOENT"===n.code?"file_not_found":"EACCES"===n.code?"permission_denied":"unknown_error";$n(e.client,_n(i,t,a,n.message))}}}const Nn=ve(N.agentrixHomeDir,"credentials");function On(e,n){const t=function(e){return ve(Nn,`${e}.pat.enc`)}(e);if(!oe(t))return null;try{const e=re(t,"utf8"),{iv:a,authTag:s,encrypted:i}=JSON.parse(e),o=n.slice(0,32),r=R("aes-256-gcm",o,Buffer.from(a,"hex"));r.setAuthTag(Buffer.from(s,"hex"));let c=r.update(i,"hex","utf8");return c+=r.final("utf8"),c}catch{return null}}const jn=100,qn=[{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 Un{apiUrl;pat;requestId;gitServerId;constructor(e,n,t){this.apiUrl=e,this.pat=n,this.requestId=t?.requestId,this.gitServerId=t?.gitServerId}logPrefix(){return`[GITLAB EXECUTOR] reqId=${this.requestId??"-"}, gitServer=${this.gitServerId??"-"}`}summarizeResult(e,n){if(Array.isArray(n))return`items=${n.length}`;if(n&&"object"==typeof n){const t=n;return"resolveGitAuthContext"===e?`authMode=${String(t.authMode??"unknown")}, hasPat=${Boolean(t.hasPat)}`:"number"in t||"state"in t?`number=${String(t.number??"-")}, state=${String(t.state??"-")}`:`keys=${Object.keys(t).join(",")||"-"}`}return"type="+typeof n}truncateText(e,n=300){return e.length<=n?e:`${e.slice(0,n)}...`}async requestWithResponse(e,n="GET",t){const a=`${this.apiUrl}${e}`,s={Authorization:`Bearer ${this.pat}`,"Content-Type":"application/json"},i=Date.now();O.debug(`${this.logPrefix()} request start: ${n} ${e}`);try{const o=await fetch(a,{method:n,headers:s,body:t?JSON.stringify(t):void 0}),r=Date.now()-i;if(!o.ok){const t=await o.text().catch(()=>"Unknown error"),a=this.truncateText(t);throw O.warn(`${this.logPrefix()} request failed: ${n} ${e}, status=${o.status}, elapsedMs=${r}, detail=${a}`),{status:o.status,message:`GitLab API error: ${o.status} ${o.statusText}`,detail:a}}return O.debug(`${this.logPrefix()} request success: ${n} ${e}, elapsedMs=${r}`),{data:await o.json(),headers:o.headers}}catch(t){if("object"==typeof t&&null!==t&&"status"in t)throw t;const a=t instanceof Error?t.message:"Unknown network error";throw O.error(`${this.logPrefix()} request exception: ${n} ${e}, message=${a}`),{status:0,message:`GitLab request failed: ${a}`}}}async request(e,n="GET",t){const{data:a}=await this.requestWithResponse(e,n,t);return a}withQueryParams(e,n){const[t,a=""]=e.split("?"),s=new URLSearchParams(a);for(const[e,t]of Object.entries(n))s.set(e,String(t));const i=s.toString();return i?`${t}?${i}`:t}parseTotalPages(e){const n=e.get("x-total-pages");if(!n)return null;const t=Number.parseInt(n,10);return!Number.isFinite(t)||t<=0?null:t}async fetchRemainingPagesInBatches(e,n){const t=[];for(let a=2;a<=e;a+=4){const s=Math.min(a+4-1,e),i=Array.from({length:s-a+1},(e,n)=>a+n),o=await Promise.all(i.map(e=>n(e)));for(const e of o)t.push(...e)}return t}async requestPaginated(e){const n=this.withQueryParams(e,{per_page:jn,page:1}),t=await this.requestWithResponse(n),a=[...t.data],s=this.parseTotalPages(t.headers);if(s&&s>1){const n=await this.fetchRemainingPagesInBatches(s,async n=>{const t=this.withQueryParams(e,{per_page:jn,page:n});return this.request(t)});return a.push(...n),a}if(!s&&t.data.length===jn){let n=2;for(;;){const t=this.withQueryParams(e,{per_page:jn,page:n}),s=await this.request(t);if(0===s.length)break;if(a.push(...s),s.length<jn)break;n+=1}}return a}async executeOperation(e,n){O.info(`${this.logPrefix()} execute operation: op=${e}, payloadKeys=${Object.keys(n||{}).join(",")||"-"}`);try{let t;switch(e){case"listRepos":t=await this.listRepos();break;case"listBranches":t=await this.listBranches(n.owner,n.name);break;case"createMergeRequest":t=await this.createMergeRequest(n);break;case"getMergeRequest":t=await this.getMergeRequest(n.owner,n.name,n.iid);break;case"listMergeRequests":t=await this.listMergeRequests(n.owner,n.name);break;case"requestGitlabApi":t=await this.requestGitlabApi(n);break;case"resolveGitAuthContext":t={authMode:"local_pat",hasPat:!0};break;default:throw{status:400,message:`Unknown operation: ${e}`}}return O.info(`${this.logPrefix()} operation success: op=${e}, summary=${this.summarizeResult(e,t)}`),t}catch(n){const t=n instanceof Error?n.message:"object"==typeof n&&null!==n&&"message"in n?String(n.message):"Unknown error";throw O.error(`${this.logPrefix()} operation failed: op=${e}, message=${t}`),n}}async listRepos(){return(await this.requestPaginated("/projects?membership=true&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,n){const t=encodeURIComponent(`${e}/${n}`);return(await this.requestPaginated(`/projects/${t}/repository/branches`)).map(e=>({name:e.name,commit:{sha:e.commit.id,url:""},protected:e.protected}))}async createMergeRequest(e){const n=encodeURIComponent(`${e.owner}/${e.repo}`),t=await this.request(`/projects/${n}/merge_requests`,"POST",{source_branch:e.head,target_branch:e.base,title:e.title,description:e.body||""});return{number:t.iid,title:t.title,body:t.description,state:"opened"===t.state?"open":t.state,url:t.web_url,head:t.source_branch,base:t.target_branch,createdAt:t.created_at,updatedAt:t.updated_at}}async getMergeRequest(e,n,t){const a=encodeURIComponent(`${e}/${n}`),s=await this.request(`/projects/${a}/merge_requests/${t}`);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,n){const t=encodeURIComponent(`${e}/${n}`);return(await this.request(`/projects/${t}/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 n="string"==typeof e?e.toUpperCase():"GET";if("GET"===n||"POST"===n||"PUT"===n||"PATCH"===n||"DELETE"===n)return n;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 n=new URLSearchParams;for(const[t,a]of Object.entries(e))if(null!=a)if(Array.isArray(a))for(const e of a){if("string"!=typeof e&&"number"!=typeof e&&"boolean"!=typeof e)throw{status:400,message:`Proxy query value for "${t}" is invalid`};n.append(t,String(e))}else{if("string"!=typeof a&&"number"!=typeof a&&"boolean"!=typeof a)throw{status:400,message:`Proxy query value for "${t}" is invalid`};n.append(t,String(a))}return n.toString()}isProxyAllowed(e,n){return qn.some(t=>t.method===e&&t.pattern.test(n))}async requestGitlabApi(e){const n=this.parseProxyMethod(e.method),t=this.parseProxyPath(e.path),a=this.buildProxyQueryString(e.query),s=a.length>0?`${t}?${a}`:t;if(!this.isProxyAllowed(n,t))throw{status:403,message:`Proxy path not allowed: ${n} ${t}`};return"GET"===n?await this.request(s,n):await this.request(s,n,e.body)}}function Gn(e){return async(n,t)=>{O.info(`[EVENT HANDLER] create-task: ${n.taskId}, agentType=${n.agentType}, agentId=${n.agentId}`),"task-message"===n.event?await e.workerManager.startWorker(n,"create-task"):O.error(`[EVENT HANDLER] create-task expects task-message, got ${n.event} for task ${n.taskId}`)}}function Ln(e){return async(n,t)=>{O.debug(`[EVENT HANDLER] resume-task: ${n.taskId}, agentSessionId=${n.agentSessionId}`),await e.workerManager.startWorker(n,"resume-task")}}function Wn(e){return async n=>{O.info("[EVENT HANDLER] shutdown-machine received",n),e.requestShutdown("agentrix-app",n.reason)}}function Fn(e){return async(n,t)=>{O.info(`[EVENT HANDLER] deploy-agent received: taskId=${n.taskId}, draftAgentId=${n.draftAgentId}, targetAgentId=${n.targetAgentId}, sourcePath=${n.sourcePath}`),await e.workerManager.startDeploymentWorker(n)}}function Hn(e){return async n=>{O.info(`[EVENT HANDLER] stop-task: ${n.taskId}, reason=${n.reason||"n/a"}`),e.workerManager.stopSession(n.taskId)||O.warn(`[EVENT HANDLER] stop-task failed, task not found: ${n.taskId}`)}}function Bn(e){return async n=>{O.info(`[GITLAB PROXY] request received: reqId=${n.requestId}, op=${n.operation}, gitServer=${n.gitServerId}, ttlMs=${n.ttlMs}, payloadKeys=${function(e){const n=Object.keys(e||{});return n.length>0?n.join(","):"-"}(n.payload)}`);const t=Date.now(),a=t=>{const a={eventId:n.requestId,requestId:n.requestId,machineId:e.machineId,...t};e.client?(e.client.send("daemon-gitlab-response",a),O.info(`[GITLAB PROXY] response sent: reqId=${n.requestId}, op=${n.operation}, success=${t.success}, executionMs=${t.executionTimeMs}`)):O.error(`[GITLAB PROXY] response dropped: reqId=${n.requestId}, op=${n.operation}, reason=socket-client-unavailable`)};try{const e=await N.getSecretKey();if(!e)return O.warn(`[GITLAB PROXY] machine secret key unavailable: reqId=${n.requestId}, op=${n.operation}, gitServer=${n.gitServerId}`),void a({success:!1,errorCode:"PAT_MISSING",errorMessage:"Machine secret key not available",executionTimeMs:Date.now()-t});const s=On(n.gitServerId,e);if(!s)return O.warn(`[GITLAB PROXY] PAT missing: reqId=${n.requestId}, op=${n.operation}, gitServer=${n.gitServerId}`),void a({success:!1,errorCode:"PAT_MISSING",errorMessage:`No PAT configured for git server ${n.gitServerId}`,executionTimeMs:Date.now()-t});const i=n.payload.apiUrl;if(!i)return O.warn(`[GITLAB PROXY] apiUrl missing in payload: reqId=${n.requestId}, op=${n.operation}, gitServer=${n.gitServerId}`),void a({success:!1,errorCode:"PAT_MISSING",errorMessage:"GitLab API URL not provided in request",executionTimeMs:Date.now()-t});O.info(`[GITLAB PROXY] executing: reqId=${n.requestId}, op=${n.operation}, gitServer=${n.gitServerId}, apiHost=${function(e){try{return new URL(e).host}catch{return"invalid-url"}}(i)}`);const o=new Un(i,s,{requestId:n.requestId,gitServerId:n.gitServerId}),r=await o.executeOperation(n.operation,n.payload);O.info(`[GITLAB PROXY] execution succeeded: reqId=${n.requestId}, op=${n.operation}, summary=${function(e,n){if(Array.isArray(n))return`items=${n.length}`;if(n&&"object"==typeof n){const t=n;return"resolveGitAuthContext"===e?`authMode=${String(t.authMode??"unknown")}, hasPat=${Boolean(t.hasPat)}`:"number"in t||"state"in t?`number=${String(t.number??"-")}, state=${String(t.state??"-")}`:`keys=${Object.keys(t).join(",")||"-"}`}return"type="+typeof n}(n.operation,r)}`),a({success:!0,data:r,executionTimeMs:Date.now()-t})}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?function(e,n=300){return e.length<=n?e:`${e.slice(0,n)}...`}(s.detail):void 0,c="number"==typeof s.status?String(s.status):"unknown";O.error(`[GITLAB PROXY] execution failed: reqId=${n.requestId}, op=${n.operation}, errorCode=${i}, status=${c}, message=${o}${r?`, detail=${r}`:""}`),a({success:!1,errorCode:i,errorMessage:o,executionTimeMs:Date.now()-t})}}}const zn=parseInt(process.env.MAX_WORKSPACE_FILE_SIZE_MB||"100",10);function Kn(e,n){if(!e)return;if("string"==typeof n)return void(e.sendMessage?e.sendMessage(n):e.send&&e.send(n));const t=Buffer.from(n);e.sendMessageBinary?e.sendMessageBinary(t):e.send&&e.send(t)}class Vn{client;machineId;iceServers=[];sessions=new Map;rtcModule;peerConstructor;constructor(e,n){this.client=e,this.machineId=n;const t=Ce(import.meta.url);var a;this.rtcModule=t("node-datachannel"),this.peerConstructor=(a=this.rtcModule).RTCPeerConnection||a.PeerConnection||a.RTCConnection||a.PeerConnection,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))):O.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:d()})}handleIceServersResponse(e){this.iceServers=function(e){const n=[];return e.forEach(e=>{Array.isArray(e.urls)?n.push(...e.urls):n.push(e.urls)}),n}(e.iceServers),O.info(`[RTC] Loaded ${this.iceServers.length} ICE servers`)}handleRtcRequest(e){if(!this.peerConstructor)return;const n=e.userId;if(!n)return void O.warn("[RTC] machine-rtc-request missing userId");const t=e.workspaceUserId||n,a=e.taskId;if(this.sessions.has(e.sessionId))return void this.sendMachineRtcResponse(e.sessionId,n,!0);const s=new this.peerConstructor(e.sessionId,{iceServers:this.iceServers}),i={sessionId:e.sessionId,userId:n,workspaceUserId:t,allowedTaskId:a||void 0,peerConnection:s,lastActivity:Date.now(),remoteDescriptionSet:!1,pendingCandidates:[]};this.sessions.set(e.sessionId,i),this.registerPeerHandlers(i),this.sendMachineRtcResponse(e.sessionId,n,!0)}sendMachineRtcResponse(e,n,t,a){this.client.send("machine-rtc-response",{eventId:d(),machineId:this.machineId,sessionId:e,accepted:t,reason:a,userId:n,capabilities:{dataChannel:!0}})}handleRtcSignal(e){if(!this.peerConstructor)return;if("app"!==e.from)return;const n=e.userId;if(!n)return void O.warn("[RTC] rtc-signal missing userId");const t=e.workspaceUserId||n,a=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:n,workspaceUserId:t,allowedTaskId:a||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){O.warn("[RTC] Failed to apply remote signal",e)}}registerPeerHandlers(e){const{peerConnection:n}=e;n.onStateChange?.(n=>{O.info(`[RTC] Peer state (${e.sessionId}): ${n}`)}),n.onGatheringStateChange?.(n=>{O.info(`[RTC] ICE gathering (${e.sessionId}): ${n}`)}),n.onLocalDescription?.((n,t)=>{const a=function(e,n){return e&&"object"==typeof e&&"string"==typeof e.sdp?{sdp:e.sdp,type:e.type||n}:{sdp:String(e||""),type:n}}(n,t);this.client.send("rtc-signal",{eventId:d(),machineId:this.machineId,sessionId:e.sessionId,from:"machine",signal:a,userId:e.userId})}),n.onLocalCandidate?.((n,t,a)=>{const s=function(e,n,t){return"string"==typeof e?{candidate:e,sdpMid:n||"0",sdpMLineIndex:t??0}:e&&"string"==typeof e.candidate?{candidate:e.candidate,sdpMid:e.sdpMid||e.mid||n||"0",sdpMLineIndex:"number"==typeof e.sdpMLineIndex?e.sdpMLineIndex:t??0}:null}(n,t,a);s&&this.client.send("rtc-signal",{eventId:d(),machineId:this.machineId,sessionId:e.sessionId,from:"machine",signal:{candidate:s},userId:e.userId})}),n.onDataChannel?.(n=>{e.dataChannel=n,this.registerDataChannel(e,n)})}registerDataChannel(e,n){n.onOpen?.(()=>{O.info(`[RTC] Data channel open (${e.sessionId})`),e.lastActivity=Date.now(),Kn(n,JSON.stringify({v:1,type:"control.ready",channel:"control",requestId:`req-${e.sessionId}`,streamId:0,timestamp:(new Date).toISOString(),payload:{ok:!0}}))}),n.onClosed?.(()=>{O.warn(`[RTC] Data channel closed (${e.sessionId})`),e.peerConnection.close?.(),this.sessions.delete(e.sessionId)}),n.onError?.(n=>{O.error(`[RTC] Data channel error (${e.sessionId})`,n)}),n.onMessage?.(n=>{e.lastActivity=Date.now(),this.handleDataChannelMessage(e,n)})}handleDataChannelMessage(e,n){if(Buffer.isBuffer(n)||n instanceof Uint8Array){try{m(new Uint8Array(n))}catch(e){O.warn("[RTC] Received binary payload without handler")}return}let t=null;if("string"==typeof n?t=n:n&&"string"==typeof n.text&&(t=n.text),!t)return;let a=null;try{a=JSON.parse(t)}catch(e){return void O.warn("[RTC] Non-JSON message",t)}a&&"string"==typeof a.type&&"file.request"===a.type&&this.handleFileRequest(e,a).catch(e=>{O.error("[RTC] Failed to handle file request",e)})}async handleFileRequest(e,n){const t=n.payload;if(!t)return;if(t.userId!==e.workspaceUserId)return void this.sendControl(e,{v:1,type:"file.error",channel:"file",requestId:n.requestId,streamId:n.streamId,timestamp:(new Date).toISOString(),error:{code:"unauthorized",message:"Unauthorized workspace access"}});if(e.allowedTaskId&&t.taskId!==e.allowedTaskId)return void this.sendControl(e,{v:1,type:"file.error",channel:"file",requestId:n.requestId,streamId:n.streamId,timestamp:(new Date).toISOString(),error:{code:"unauthorized",message:"Unauthorized task access"}});const a=(s=t.userId,i=t.taskId,o=t.relativePath,N.resolveWorkspaceFilePath(s,i,o));var s,i,o;if(!se.existsSync(a))return void this.sendControl(e,{v:1,type:"file.error",channel:"file",requestId:n.requestId,streamId:n.streamId,timestamp:(new Date).toISOString(),error:{code:"file_not_found",message:"File or directory not found"}});const r=await se.promises.stat(a);if(!function(e,n){return!n||e.mtime.toISOString()!==n}(r,t.ifModifiedSince))return void this.sendControl(e,{v:1,type:"file.not_modified",channel:"file",requestId:n.requestId,streamId:n.streamId,timestamp:(new Date).toISOString()});if(r.isDirectory()||"directory"===t.entryType){const t=await se.promises.readdir(a,{withFileTypes:!0}),s={entries:await Promise.all(t.map(async e=>{const n=fe.join(a,e.name),t=await se.promises.stat(n);return{name:e.name,type:e.isDirectory()?"directory":"file",size:t.size,modifiedAt:t.mtime.toISOString()}})),modifiedAt:r.mtime.toISOString()};return void this.sendControl(e,{v:1,type:"file.dir",channel:"file",requestId:n.requestId,streamId:n.streamId,timestamp:(new Date).toISOString(),payload:s})}const c=1024*(t.maxFileSizeMB??zn)*1024;if(r.size>c)return void this.sendControl(e,{v:1,type:"file.error",channel:"file",requestId:n.requestId,streamId:n.streamId,timestamp:(new Date).toISOString(),error:{code:"file_too_large",message:"File exceeds size limit"}});const p=Rn.lookup(a)||"application/octet-stream",l={size:r.size,mimeType:"string"==typeof p?p:"application/octet-stream",modifiedAt:r.mtime.toISOString()};this.sendControl(e,{v:1,type:"file.meta",channel:"file",requestId:n.requestId,streamId:n.streamId,timestamp:(new Date).toISOString(),payload:l}),await this.sendFileChunks(e,n.streamId,a),this.sendControl(e,{v:1,type:"file.end",channel:"file",requestId:n.requestId,streamId:n.streamId,timestamp:(new Date).toISOString(),payload:{size:r.size}})}async sendFileChunks(e,n,t){const a=e.dataChannel;if(!a)return;const s=se.createReadStream(t,{highWaterMark:65536});let i=0;await new Promise((e,t)=>{s.on("data",e=>{const t=g.Binary|(0===i?g.Start:0),s=Buffer.isBuffer(e)?e:Buffer.from(e),o=new Uint8Array(s.buffer,s.byteOffset,s.byteLength),r=h({streamId:n,seq:i,flags:t,payloadLength:o.length},o);Kn(a,r),i+=1}),s.on("end",()=>{if(i>0){const e=h({streamId:n,seq:i,flags:g.End|g.Binary,payloadLength:0},new Uint8Array);Kn(a,e)}e()}),s.on("error",e=>t(e))})}sendControl(e,n){const t=e.dataChannel;t&&Kn(t,JSON.stringify(n))}applyRemoteSignal(e,n){const{peerConnection:t}=e;if(n&&n.sdp&&n.type)return t.setRemoteDescription?.(n.sdp,n.type),e.remoteDescriptionSet=!0,e.pendingCandidates?.forEach(e=>{try{t.addRemoteCandidate?.(e.candidate,e.mid)}catch(e){O.warn("[RTC] Failed to add queued candidate",e)}}),void(e.pendingCandidates=[]);if(n&&n.candidate){const a=n.candidate,s="string"==typeof a?a:a&&"string"==typeof a.candidate?a.candidate:null,i=n.sdpMid||a?.sdpMid||a?.mid||"0";if(s){if(!e.remoteDescriptionSet)return void e.pendingCandidates?.push({candidate:s,mid:i});t.addRemoteCandidate?.(s,i)}}}}class Xn{client;context;rtcManager;constructor(e,n,t){const{machineId:a,...s}=e;this.client=new wn(s),this.context={machineId:a,workerManager:n,requestShutdown:t.requestShutdown,client:this.client},this.rtcManager=new Vn(this.client,a),this.initHandlers(),this.rtcManager.registerHandlers()}connect(){return new Promise((e,n)=>{const t=setTimeout(()=>{n(new Error("Machine connection timeout after 30 seconds"))},3e4);this.client.onLifecycle("connect",()=>{clearTimeout(t),e()}),this.client.onLifecycle("connect_error",e=>{clearTimeout(t),n(e)}),this.client.connect()})}async disconnect(){this.client.connected&&await this.client.flush(5e3).catch(()=>{}),this.rtcManager.shutdown(),this.client.disconnect()}initHandlers(){const e={"create-task":Gn(n=this.context),"resume-task":Ln(n),"stop-task":Hn(n),"deploy-agent":Fn(n),"shutdown-machine":Wn(n),"workspace-file-request":Dn({client:n.client}),"daemon-gitlab-request":Bn(n)};var n;this.client.onEventWithAck("create-task",e["create-task"]),this.client.onEventWithAck("resume-task",e["resume-task"]),this.client.onEvent("stop-task",e["stop-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 Jn=null;let Yn=!1;async function Qn(){if(Yn)O.info("[caffeinate] Already stopping, skipping");else if(Jn&&!Jn.killed){Yn=!0,O.info(`[caffeinate] Stopping caffeinate process PID ${Jn.pid}`);try{Jn.kill("SIGTERM"),await new Promise(e=>setTimeout(e,1e3)),Jn&&!Jn.killed&&Jn.kill("SIGKILL"),Jn=null,Yn=!1}catch(e){O.info("[caffeinate] Error stopping caffeinate:",e),Yn=!1}}}let Zn=!1;function et(e){const{pid:n,name:t,cmd:a}=e;if(n===process.pid||n===process.ppid)return null;if(!(t.includes("agentrix")||"node"===t&&(a.includes("agentrix-cli")||a.includes("dist/index.mjs")||a.includes("dist\\index.mjs"))||("MainThread"===t||t.includes("MainThread"))&&(a.includes("agentrix-cli")||a.includes("dist/index.mjs")||a.includes("agentrix.mjs"))||a.includes("agentrix.mjs")||a.includes("agentrix-cli")||a.includes("tsx")&&a.includes("src/index.ts")&&a.includes("agentrix-cli")))return null;let s="unknown";const i=a.toLowerCase();return i.includes(" worker")?s="worker":i.includes(" upgrade-daemon")?s="upgrade-daemon":i.includes(" daemon")?s="daemon":i.includes("doctor")&&(s="doctor"),{pid:n,command:a||t,type:s}}async function nt(){try{let e;e="win32"===process.platform?await async function(){try{const e=Ae("wmic process where \"name='node.exe'\" get ProcessId,CommandLine /format:csv",{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}),n=[],t=e.split("\n").map(e=>e.trim()).filter(Boolean);for(let e=1;e<t.length;e++){const a=t[e];if(!a)continue;const s=a.indexOf(",");if(-1===s)continue;const i=a.substring(s+1),o=i.lastIndexOf(",");if(-1===o)continue;const r=i.substring(0,o).trim(),c=i.substring(o+1).trim(),p=parseInt(c,10);isNaN(p)||n.push({pid:p,name:"node",cmd:r})}return n}catch(e){return[]}}():(await Me()).map(e=>({pid:e.pid,name:e.name||"",cmd:e.cmd||""}));const n=[];for(const t of e){const e=et(t);e&&n.push(e)}return n}catch(e){return[]}}function tt(e){try{const n="win32"===process.platform?"where":"which";return{available:!0,path:Ae(`${n} ${e}`,{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).trim()}}catch{return{available:!1}}}function at(){const e=Re(),n=function(){const e=tt("git"),n=tt("claude"),t=tt("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:n.available,required:!0,description:"Claude Code CLI (required for most features)",installCommand:"npm install -g @anthropic-ai/claude-code",path:n.path},{name:"codex",installed:t.available,required:!1,description:"Codex CLI (optional, for Codex tasks)",installCommand:"npm install -g @codex-ai/codex-cli",path:t.path}]}(),t=function(e){if("macos"===e){const e=tt("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=tt("bwrap"),n=tt("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:n.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:n.path}]}return[]}(e),a=n.filter(e=>e.required&&!e.installed),s=t.filter(e=>e.required&&!e.installed);return{cli:n,sandbox:t,allSatisfied:0===a.length&&0===s.length,missingSandbox:s,missingCli:a}}function st(){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:N.agentrixHomeDir,serverUrl:N.serverUrl,logsDir:N.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 it(e){if(e||(e="all"),console.log(s.bold.cyan("\n🩺 Agentrix CLI Doctor\n")),"all"===e){console.log(s.bold("📋 Basic Information")),console.log(`Agentrix CLI Version: ${s.green(q.version)}`),console.log(`Platform: ${s.green(process.platform)} ${process.arch}`),console.log(`Node.js Version: ${s.green(process.version)}`),console.log(""),console.log(s.bold("🔧 Daemon Spawn Diagnostics"));const e=j(),n=ve(e,"bin","agentrix.mjs"),t=ve(e,"dist","index.mjs");console.log(`Project Root: ${s.blue(e)}`),console.log(`Wrapper Script: ${s.blue(n)}`),console.log(`CLI Entrypoint: ${s.blue(t)}`),console.log(`Wrapper Exists: ${oe(n)?s.green("✓ Yes"):s.red("❌ No")}`),console.log(`CLI Exists: ${oe(t)?s.green("✓ Yes"):s.red("❌ No")}`),console.log(""),console.log(s.bold("⚙️ Configuration")),console.log(`Agentrix Home: ${s.blue(N.agentrixHomeDir)}`),console.log(`Server URL: ${s.blue(N.serverUrl)}`),console.log(`Logs Dir: ${s.blue(N.getStatePaths().logsDir)}`),console.log(s.bold("\n🌍 Environment Variables"));const a=st();console.log(`AGENTRIX_HOME_DIR: ${a.AGENTRIX_HOME_DIR?s.green(a.AGENTRIX_HOME_DIR):s.gray("not set")}`),console.log(`AGENTRIX_SERVER_URL: ${a.AGENTRIX_SERVER_URL?s.green(a.AGENTRIX_SERVER_URL):s.gray("not set")}`),console.log(`DANGEROUSLY_LOG_TO_SERVER: ${a.DANGEROUSLY_LOG_TO_SERVER_FOR_AI_AUTO_DEBUGGING?s.yellow("ENABLED"):s.gray("not set")}`),console.log(`DEBUG: ${a.DEBUG?s.green(a.DEBUG):s.gray("not set")}`),console.log(`NODE_ENV: ${a.NODE_ENV?s.green(a.NODE_ENV):s.gray("not set")}`),console.log(s.bold("\n🔐 Authentication"));try{await N.readCredentials()?console.log(s.green("✓ Authenticated (credentials found)")):console.log(s.yellow("⚠️ Not authenticated (no credentials)"))}catch(e){console.log(s.red("❌ Error reading credentials"))}!function(e=!1){const n=at(),t=Re();console.log(s.bold("\n🔧 CLI Dependencies"));for(const t of n.cli)if(t.installed)console.log(s.green(`✓ ${t.name}`),s.gray(`- ${t.description}`)),e&&t.path&&console.log(s.gray(` Location: ${t.path}`));else{const e=t.required?s.red("❌"):s.yellow("⚠️");console.log(`${e} ${t.name}`,s.gray(`- ${t.description}`)),t.installCommand&&console.log(s.blue(` Install: ${t.installCommand}`))}if(n.sandbox.length>0){console.log(s.bold("\n🔒 Sandbox Dependencies")),console.log(s.gray(`Platform: ${t}`));for(const t of n.sandbox)t.installed?(console.log(s.green(`✓ ${t.name}`),s.gray(`- ${t.description}`)),e&&t.path&&console.log(s.gray(` Location: ${t.path}`))):(console.log(s.red(`❌ ${t.name}`),s.gray(`- ${t.description}`)),t.installCommand&&console.log(s.blue(` Install: ${t.installCommand}`)))}else console.log(s.bold("\n🔒 Sandbox Dependencies")),console.log(s.yellow(`⚠️ Platform ${t} not supported - sandbox will be disabled`));if(n.allSatisfied)return console.log(s.bold.green("\n✓ All required dependencies are installed")),!0;{console.log(s.bold.red("\n⚠️ Missing Required Dependencies"));const e=[...n.missingCli,...n.missingSandbox];for(const n of e)console.log(s.red(` • ${n.name}`));console.log(s.yellow("\nPlease install missing dependencies before starting the daemon."))}}(!0)}console.log(s.bold("\n🤖 Daemon Status"));try{const n=await mn(),t=await N.readDaemonState();if(n&&t?(console.log(s.green("✓ Daemon is running")),console.log(` PID: ${t.pid}`),console.log(` Started: ${new Date(t.startTime).toLocaleString()}`),console.log(` CLI Version: ${t.cliVersion}`),t.port&&console.log(` HTTP Port: ${t.port}`)):t&&!n?console.log(s.yellow("⚠️ Daemon state exists but process not running (stale)")):console.log(s.red("❌ Daemon is not running")),t){console.log(s.bold("\n📄 Daemon State:"));const e=N.getStatePaths();console.log(s.blue(`Location: ${e.daemonStateFile}`)),console.log(s.gray(JSON.stringify(t,null,2)))}const a=await nt();if(a.length>0){console.log(s.bold("\n🔍 All Agentrix CLI Processes"));const e=a.reduce((e,n)=>(e[n.type]||(e[n.type]=[]),e[n.type].push(n),e),{});Object.entries(e).forEach(([e,n])=>{console.log(s.blue(`\n${{daemon:"🤖 Daemon","upgrade-daemon":"🔄 Upgrade Daemon",worker:"🔗 Workers",doctor:"🩺 Doctor",unknown:"❓ Unknown"}[e]||e}:`)),n.forEach(({pid:n,command:t})=>{const a=e.startsWith("dev")?s.cyan:e.includes("daemon")?s.blue:s.gray;console.log(` ${a(`PID ${n}`)}: ${s.gray(t)}`)})})}else console.log(s.red("❌ No agentrix processes found"));"all"===e&&a.length>1&&(console.log(s.bold("\n💡 Process Management")),console.log(s.gray("To clean up runaway processes: agentrix killall")))}catch(e){console.log(s.red("❌ Error checking daemon status"))}}let ot=null;async function rt(){const e=ut(),n=function(e){try{return JSON.stringify(e)}catch{return""}}(e);if(ot&&ot.expiresAt>Date.now()&&ot.overridesSignature===n)return ot.openers;const t=pt(e),a=[];for(const e of t){const n=e.isSupported();n&&a.push({id:e.id,label:e.label,kind:e.kind,method:e.method,urlTemplate:e.urlTemplate,supported:n})}return ot={expiresAt:Date.now()+6048e5,openers:a,overridesSignature:n},a}function ct(e){const n=process.platform;if("darwin"===n)return function(e){const n=lt(e),t=[];if(n){const e=vt(n);t.push("-e",`set defaultLocation to POSIX file "${e}"`,"-e","set chosenFolder to choose folder default location defaultLocation")}else t.push("-e","set chosenFolder to choose folder");return t.push("-e","POSIX path of chosenFolder"),dt(ft("osascript",t,{captureOutput:!0}))}(e);if("win32"===n)return function(e){const n=ht("powershell")?"powershell":ht("pwsh")?"pwsh":null;if(!n)throw new Error("PowerShell is required to pick a directory");const t=lt(e),a=["Add-Type -AssemblyName System.Windows.Forms;","$dialog = New-Object System.Windows.Forms.FolderBrowserDialog;",t?`$dialog.SelectedPath = '${xt(t)}';`:"","$null = $dialog.ShowDialog();","$dialog.SelectedPath;"].filter(Boolean).join(" ");return dt(ft(n,"powershell"===n?["-NoProfile","-STA","-Command",a]:["-NoProfile","-Sta","-Command",a],{captureOutput:!0}))}(e);if("linux"===n)return function(e){const n=lt(e);if(ht("zenity")){const e=["--file-selection","--directory","--title=Select Folder"];if(n){const t=n.endsWith("/")?n:`${n}/`;e.push(`--filename=${t}`)}return dt(ft("zenity",e,{captureOutput:!0}))}if(ht("kdialog")){const e=["--getexistingdirectory"];return n&&e.push(n),dt(ft("kdialog",e,{captureOutput:!0}))}throw new Error("No supported directory picker is available")}(e);throw new Error("Directory picker is not supported on this platform")}function pt(e){const n=process.platform,t=["Visual Studio Code","Visual Studio Code - Insiders"],a=["Cursor"],s=["IntelliJ IDEA","IntelliJ IDEA CE","IntelliJ IDEA Ultimate"],i=["WebStorm"],o=["PyCharm","PyCharm CE","PyCharm Professional"],r=[{id:"vscode",label:"VS Code",kind:"editor",method:"scheme",urlTemplate:"vscode://file/{path}?windowId=_blank",scheme:"vscode",macAppNames:t,isSupported:()=>mt("vscode",n,t)},{id:"cursor",label:"Cursor",kind:"editor",method:"scheme",urlTemplate:"cursor://file/{path}?windowId=_blank",scheme:"cursor",macAppNames:a,isSupported:()=>mt("cursor",n,a)},{id:"idea",label:"IntelliJ IDEA",kind:"ide",method:"scheme",urlTemplate:"idea://open?file={path}&newWindow=true",scheme:"idea",macAppNames:s,isSupported:()=>mt("idea",n,s)},{id:"pycharm",label:"PyCharm",kind:"ide",method:"scheme",urlTemplate:"pycharm://open?file={path}&newWindow=true",scheme:"pycharm",macAppNames:o,isSupported:()=>mt("pycharm",n,o)},{id:"webstorm",label:"WebStorm",kind:"ide",method:"scheme",urlTemplate:"webstorm://open?file={path}&newWindow=true",scheme:"webstorm",macAppNames:i,isSupported:()=>mt("webstorm",n,i)},{id:"file-manager",label:"darwin"===n?"Finder":"win32"===n?"Explorer":"Files",kind:"file-manager",method:"cli",isSupported:()=>function(e){return"darwin"===e?ht("open"):"win32"===e||"linux"===e&&(ht("xdg-open")||ht("gio"))}(n),open:e=>function(e,n){if("darwin"!==n){if("win32"!==n){if("linux"===n)return ht("xdg-open")?void ft("xdg-open",[e]):void ft("gio",["open",e]);throw new Error("File manager open is not supported on this platform")}ft("explorer",[e])}else ft("open",[e])}(e,n)},{id:"open-with",label:"Open With...",kind:"system",method:"cli",isSupported:()=>function(e){return"darwin"===e?ht("osascript"):"win32"===e?ht("powershell")||ht("pwsh"):"linux"===e&&ht("gio")}(n),open:e=>function(e,n){if("darwin"!==n)if("win32"!==n){if("linux"!==n)throw new Error("Open With is not supported on this platform");ft("gio",["open","--ask",e])}else ft(ht("powershell")?"powershell":"pwsh",["-NoProfile","-Command",`Start-Process -Verb OpenAs -FilePath '${xt(e)}'`]);else if(null===ft("osascript",["-e",`set targetPath to POSIX file "${vt(e)}"`,"-e","set appChoice to choose application","-e","tell appChoice to open targetPath"],{captureOutput:!0}))throw new Error("No application selected")}(e,n)}];return function(e,n,t){const a=t??ut();return e.map(e=>{const t=a[e.id];if(!t)return e;if(!1===t.enabled)return{...e,isSupported:()=>!1};const s={...e,label:t.label??e.label,method:t.method??e.method,urlTemplate:t.urlTemplate??e.urlTemplate};if(t.command){const a=function(e){return e?Array.isArray(e)?e:[e]:[]}(t.appName??e.macAppNames);s.method="cli",s.isSupported=()=>function(e,n,t){return"darwin"===t&&n.length>0?n.some(e=>gt(e)):xe.isAbsolute(e)||e.includes(xe.sep)?oe(e):ht(e)}(t.command,a,n),s.open=e=>function(e,n,t){if(!ft(e,(n&&n.length>0?n:["{path}"]).map(e=>e.split("{path}").join(t))))throw new Error(`Command failed: ${e}`)}(t.command,t.args,e)}return s})}(r,n,e)}function lt(e){if(!e)return;const n=e.replace(/^~(?=$|[\\/])/,Q.homedir());if(oe(n)){try{if(!ce(n).isDirectory())return}catch{return}return n}}function dt(e){if(!e)return null;return e.trim()||null}function ut(){try{const e=N.readSettings();if(!e||"object"!=typeof e)return{};const n=e.openersOverrides;return n&&"object"==typeof n?n:{}}catch(e){return O.warn("[OPENERS] Failed to read opener overrides",e),{}}}function mt(e,n,t){return"darwin"===n?function(e,n){if(ht("mdfind")){const n=ft("mdfind",[`kMDItemCFBundleURLSchemes == '${e}'`],{captureOutput:!0});if(n&&n.trim())return!0}if(ht("plutil")){const n=[xe.join(Q.homedir(),"Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist"),"/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist"];for(const t of n){if(!oe(t))continue;const n=ft("plutil",["-extract","LSHandlers","json","-o","-",t],{captureOutput:!0});if(n)try{const t=JSON.parse(n);if(Array.isArray(t)&&t.some(n=>n.LSHandlerURLScheme?.toLowerCase()===e.toLowerCase()))return!0}catch(e){O.debug("[OPENERS] Failed to parse LaunchServices handlers",e)}}}return!!(n&&n.length>0)&&n.some(e=>gt(e))}(e,t):"win32"===n?function(e){return ht("reg")&&(Boolean(ft("reg",["query",`HKCU\\Software\\Classes\\${e}`]))||Boolean(ft("reg",["query",`HKCR\\${e}`])))}(e):"linux"===n&&function(e){if(ht("xdg-settings")){const n=ft("xdg-settings",["get","default-url-scheme-handler",e],{captureOutput:!0});if(n&&n.trim()&&"null"!==n.trim())return!0}if(ht("gio")){const n=ft("gio",["mime",`x-scheme-handler/${e}`],{captureOutput:!0});if(n&&/Default application/.test(n))return!0}return!1}(e)}function gt(e){return"darwin"===process.platform&&Boolean(ft("open",["-Ra",e]))}function ht(e){return"win32"===process.platform?Boolean(ft("where",[e])):Boolean(ft("sh",["-c",`command -v ${e}`]))}function ft(e,n,t){const a=je(e,n,{encoding:t?.captureOutput?"utf8":void 0,stdio:t?.captureOutput?"pipe":"ignore",windowsHide:!0});if(0!==a.status){if(t?.captureOutput){const t="string"==typeof a.stderr?a.stderr.trim():"";t&&O.warn(`[OPENERS] Command failed: ${e} ${n.join(" ")}: ${t}`)}return null}return t?.captureOutput?a.stdout:"ok"}function xt(e){return e.replace(/'/g,"''")}function vt(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function bt(e,n){if(n){const t=e.startsWith(n)?e.slice(n.length).replace(/^\//,""):ye(e);return ve(n,"versions",t)}let t=be(e),a=0;for(;a<10;){if(oe(ve(t,"agent.json"))){const n=e.slice(t.length).replace(/^\//,"");return ve(t,"versions",n)}const n=be(t);if(n===t)break;t=n,a++}const s=be(e),i=ye(e);return ve(s,`.${i}.version`)}function yt(e,n){const t=bt(e,n);if(!oe(t))return"0.0.0";try{return re(t,"utf-8").trim()}catch(e){return"0.0.0"}}function wt(e,t,a){try{const s=bt(e,a),i=be(s);if(!oe(i)){const{mkdirSync:e}=n("node:fs");e(i,{recursive:!0})}pe(s,t,"utf-8")}catch(e){}}function kt(e,n){const t=e.split(".").map(Number),a=n.split(".").map(Number);for(let e=0;e<3;e++){const n=t[e]||0,s=a[e]||0;if(n>s)return 1;if(n<s)return-1}return 0}function It(e,n,t){const a=yt(e,t),s=kt(n.metadata.version,a);if(!oe(e)){const a=be(e);if(!oe(a)){const{mkdirSync:e}=ie;e(a,{recursive:!0})}return pe(e,n.content,"utf-8"),wt(e,n.metadata.version,t),{updated:!0,reason:"created"}}if(s<=0)return{updated:!1,reason:"up-to-date"};switch(n.metadata.updateStrategy){case"overwrite":return pe(e,n.content,"utf-8"),wt(e,n.metadata.version,t),{updated:!0,reason:"overwritten"};case"create-only":return{updated:!1,reason:"create-only"};case"notify-user":return{updated:!1,reason:"requires-user-approval"};default:return{updated:!1,reason:"unknown-strategy"}}}function St(e){oe(e)||le(e,{recursive:!0})}function Tt(e){return e.split("\\").join("/")}function Ct(e){const n={};if(!oe(e))return n;const t=a=>{const s=de(a).sort();for(const i of s){const s=ve(a,i);if(ce(s).isDirectory()){t(s);continue}if("versions.json"===i)continue;const o=Tt(we(e,s));n[o]=re(s,"utf-8")}};return t(e),n}function Et(){const e=be(Ge(import.meta.url)),n=[ve(e,"template"),ve(e,"companion","template")];for(const e of n)if(oe(e))return e;return n[0]}function At(e){const n=Et(),t=ve(n,"versions",`${e}.json`);if(!oe(t))return{};try{const e=re(t,"utf-8");return JSON.parse(e)}catch(e){return console.warn(`[Companion] Failed to parse ${t}:`,e),{}}}async function Mt(e){const n=N.agentrixAgentsHomeDir,t=ve(n,"companion"),a=ve(t,"claude");St(a),St(ve(a,"memory")),St(ve(a,"skills"));const{language:s,templates:i}=function(e){const n=function(e){const n=[e,process.env.AGENTRIX_COMPANION_TEMPLATE_LANGUAGE,process.env.LC_ALL,process.env.LC_MESSAGES,process.env.LANG];for(const e of n){if(!e)continue;const n=e.trim().toLowerCase();if(n){if(n.startsWith("zh"))return"zh-Hans";if(n.startsWith("en"))return"en"}}return"en"}(e),t=Et(),a=ve(t,"common"),s=ve(t,"languages",n),i=Ct(a),o=Ct(s),r=At("common"),c=At(n),p=[],l={version:"1.0.0",updateStrategy:"create-only"};for(const[e,n]of Object.entries(i))p.push({relativePath:e,content:n,metadata:r[e]||l});for(const[e,n]of Object.entries(o))p.push({relativePath:e,content:n,metadata:c[e]||l});if(0===p.length)throw new Error(`Companion template files are missing under ${t}`);return{language:n,templates:p}}(e?.preferredLanguage),o=[];for(const e of i){const n=It(ve(t,e.relativePath),e,t);if(o.push({path:e.relativePath,updated:n.updated,reason:n.reason}),n.updated){const t="created"===n.reason?"Created":"Updated";console.log(`[Companion] ${t}: ${e.relativePath}`)}}const r=function(e,n){const t=[];for(const a of e){if("notify-user"!==a.metadata.updateStrategy)continue;const e=ve(n,a.relativePath);if(!oe(e))continue;const s=yt(e,n);kt(a.metadata.version,s)>0&&t.push({template:a,targetPath:e,currentVersion:s,newVersion:a.metadata.version})}return t}(i,t);if(r.length>0)try{const e=ve(a,"UPGRADES.md"),n=function(e){return`# Upgrades Available\n\nThe following files have new versions available:\n\n${e.map(e=>`- **${e.template.metadata.description||e.template.relativePath}**: v${e.currentVersion} → v${e.newVersion}`).join("\n")}\n\n---\n\n**Shadow's Instructions:**\n\nWhen you detect this file:\n1. Send a reminder to the main companion using \`mcp__agentrix__send_reminder\`\n2. Content: "System upgrade detected. ${e.length} file(s) available."\n3. Reference this file path so main companion can read details\n4. Exit quietly\n\n**Main Companion's Instructions:**\n\nWhen you receive the upgrade reminder:\n1. Choose appropriate timing (don't interrupt user's work)\n2. Read this file to see what's new\n3. For each upgrade, read the corresponding \`.upgrade\` file\n4. Present to user naturally, explain benefits\n5. If user agrees: integrate the new content in your own voice\n6. Update version files using Write tool (create \`.filename.version\` with new version number)\n7. Delete \`.upgrade\` files when done\n8. Delete this file when all upgrades are handled\n`}(r);pe(e,n,"utf-8");for(const e of r){const n=`${e.targetPath}.upgrade`,t=`# Upgrade: ${e.template.metadata.description||e.template.relativePath}\n\n**Current Version**: v${e.currentVersion}\n**New Version**: v${e.newVersion}\n\n---\n\n## New Content\n\n${e.template.content}\n\n---\n\n## Integration Instructions\n\n1. Read the new content above\n2. Compare with your current \`${e.template.relativePath}\`\n3. Integrate the new features in your own voice\n4. Keep your existing customizations\n5. Use Write tool to update \`versions/${e.template.relativePath}\` with content: "${e.newVersion}"\n6. Delete this file when done\n`;pe(n,t,"utf-8")}console.log(`[Companion] Created UPGRADES.md with ${r.length} pending upgrade(s)`),console.log("[Companion] Shadow will notify main companion on next heartbeat")}catch(e){console.warn("[Companion] Failed to create upgrade files (permission denied?):",e instanceof Error?e.message:e),console.warn("[Companion] Upgrade detection will be skipped. Please check sandbox permissions for agents directory.")}return console.log(`[Companion] Language: ${s}`),{agentDir:t,homeDir:a}}async function Pt(e){const{agentId:n,gitUrl:t,branch:a,subDir:s}=e,i=ve(N.agentrixAgentsHomeDir,n);if(oe(i))return{agentDir:i};const o=`${i}.tmp-${Date.now()}`;try{const e=["git","clone","--depth=1"];if(a&&e.push("--branch",a),e.push(t,o),qe(e.join(" "),{stdio:"pipe"}),s){const e=ve(o,s);if(!oe(e))throw new Error(`Sub-directory "${s}" not found in cloned repository`);ue(e,i),me(o,{recursive:!0,force:!0})}else ue(o,i);return Rt(i),{agentDir:i}}catch(e){throw oe(o)&&me(o,{recursive:!0,force:!0}),oe(i)&&me(i,{recursive:!0,force:!0}),e}}function Rt(e){const n=[],t=ve(e,"claude","plugins");if(oe(t))for(const e of de(t)){const a=ve(t,e);ce(a).isDirectory()&&oe(ve(a,"package.json"))&&n.push(a)}const a=ve(e,"claude","hooks");oe(a)&&oe(ve(a,"package.json"))&&n.push(a);for(const e of n)qe("yarn install --frozen-lockfile",{cwd:e,stdio:"pipe"}),qe("yarn build",{cwd:e,stdio:"pipe"})}function $t(e,n){const t=[],a=de(e,{withFileTypes:!0});for(const s of a){if(".gitkeep"===s.name)continue;const a=ve(e,s.name),i=ce(a),o=we(n,a);t.push({name:s.name,path:o,size:i.size,modifiedAt:i.mtimeMs,isDirectory:s.isDirectory()}),s.isDirectory()&&t.push(...$t(a,n))}return t}function _t({getChildren:e,stopSession:n,requestShutdown:t,registerSession:a,machineId:s}){return new Promise(i=>{const o=$e({logger:!1});o.setValidatorCompiler(Ne),o.setSerializerCompiler(Oe);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:_e.object({sessionId:_e.string(),metadata:_e.any()}),response:{200:_e.object({status:_e.literal("ok")})}}},async e=>{const{sessionId:n,metadata:t}=e.body;return O.debug(`[CONTROL SERVER] Session started: ${n}`),a(n,t),{status:"ok"}}),r.options("/ping",async(e,n)=>(c(n),n.send())),r.get("/ping",{schema:{response:{200:_e.object({status:_e.literal("ok"),machineId:_e.string(),timestamp:_e.string()})}}},async(e,n)=>(c(n),{status:"ok",machineId:s,timestamp:(new Date).toISOString()})),r.options("/openers",async(e,n)=>(c(n),n.send())),r.get("/openers",{schema:{response:{200:_e.object({openers:_e.array(_e.object({id:_e.string(),label:_e.string(),kind:_e.enum(["system","file-manager","editor","ide"]),method:_e.enum(["scheme","cli"]),urlTemplate:_e.string().optional(),supported:_e.boolean()}))})}}},async(e,n)=>(c(n),{openers:await rt()})),r.options("/open",async(e,n)=>(c(n),n.send())),r.options("/pick-directory",async(e,n)=>(c(n),n.send())),r.post("/open",{schema:{body:_e.object({path:_e.string(),openerId:_e.string(),userId:_e.string().optional(),taskId:_e.string().optional()}),response:{200:_e.object({success:_e.boolean(),error:_e.string().optional()})}}},async(e,n)=>{c(n);const{path:t,openerId:a,userId:s,taskId:i}=e.body;return await async function({openerId:e,targetPath:n,userId:t,taskId:a}){const s=pt(ut()).find(n=>n.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=function(e,n,t){const a=xe.resolve(e);if(!xe.isAbsolute(a))throw new Error("Path must be absolute");if(!ce(a).isDirectory())throw new Error("Path must be a directory");if(n&&t){const e=N.getTaskCwd(n,t);if(e&&!function(e,n){const t=xe.relative(n,e);return""===t||!t.startsWith("..")&&!xe.isAbsolute(t)}(a,xe.resolve(e)))throw new Error("Path is outside the task workspace")}return a}(n,t,a)}catch(e){return{success:!1,error:e instanceof Error?e.message:"Invalid path"}}try{return s.open(i),{success:!0}}catch(e){const n=e instanceof Error?e.message:"Failed to open path";return O.warn(`[OPENERS] Failed to open path: ${n}`),{success:!1,error:n}}}({openerId:a,targetPath:t,userId:s,taskId:i})}),r.post("/pick-directory",{schema:{body:_e.object({defaultPath:_e.string().optional()}),response:{200:_e.object({path:_e.string().nullable(),error:_e.string().optional()})}}},async(e,n)=>{c(n);try{return{path:ct(e.body.defaultPath)??null}}catch(e){return{path:null,error:e instanceof Error?e.message:"Failed to pick directory"}}}),r.post("/companion/ensure",{schema:{body:_e.object({preferredLanguage:_e.enum(["en","zh-Hans"]).nullable().optional()}).optional(),response:{200:_e.object({agentDir:_e.string(),homeDir:_e.string()})}}},async e=>await Mt({preferredLanguage:e.body?.preferredLanguage})),r.get("/companion/workspace",{schema:{response:{200:_e.object({files:_e.array(_e.object({name:_e.string(),path:_e.string(),size:_e.number(),modifiedAt:_e.number(),isDirectory:_e.boolean()}))})}}},async()=>{const{homeDir:e}=await Mt();return oe(e)?{files:$t(e,e)}:{files:[]}}),r.get("/companion/file",{schema:{querystring:_e.object({path:_e.string()}),response:{200:_e.object({content:_e.string()}),404:_e.object({error:_e.string()})}}},async(e,n)=>{const{homeDir:t}=await Mt(),a=ke(ve(t,e.query.path));return a.startsWith(t)&&oe(a)?{content:re(a,"utf-8")}:n.code(404).send({error:"File not found"})}),r.put("/companion/file",{schema:{body:_e.object({path:_e.string(),content:_e.string()}),response:{200:_e.object({success:_e.boolean()}),400:_e.object({error:_e.string()})}}},async(e,n)=>{const{homeDir:t}=await Mt(),a=ke(ve(t,e.body.path));return a.startsWith(t)?(le(be(a),{recursive:!0}),pe(a,e.body.content,"utf-8"),{success:!0}):n.code(400).send({error:"Invalid path"})}),r.get("/companion/config",{schema:{response:{200:_e.object({heartbeatIntervalMs:_e.number(),heartbeatEnabled:_e.boolean()})}}},async()=>{const{homeDir:e}=await Mt(),n=ve(e,"state.json");let t=9e5,a=!1;if(oe(n))try{const e=JSON.parse(re(n,"utf-8"));"number"==typeof e.heartbeatIntervalMs&&(t=e.heartbeatIntervalMs),"boolean"==typeof e.heartbeatEnabled&&(a=e.heartbeatEnabled)}catch{}return{heartbeatIntervalMs:t,heartbeatEnabled:a}}),r.put("/companion/config",{schema:{body:_e.object({heartbeatIntervalMs:_e.number().optional(),heartbeatEnabled:_e.boolean().optional()}),response:{200:_e.object({success:_e.boolean()})}}},async e=>{const{homeDir:n}=await Mt(),t=ve(n,"state.json");let a={};if(oe(t))try{a=JSON.parse(re(t,"utf-8"))}catch{}const{heartbeatIntervalMs:s,heartbeatEnabled:i}=e.body;return void 0!==s&&(a.heartbeatIntervalMs=s),void 0!==i&&(a.heartbeatEnabled=i),le(be(t),{recursive:!0}),pe(t,JSON.stringify(a,null,2),"utf-8"),{success:!0}}),r.post("/agent/install",{schema:{body:_e.object({agentId:_e.string(),gitUrl:_e.string(),branch:_e.string().optional(),subDir:_e.string().optional()}),response:{200:_e.object({agentDir:_e.string()}),500:_e.object({error:_e.string()})}}},async(e,n)=>{try{return await Pt(e.body)}catch(e){const t=e instanceof Error?e.message:String(e);return n.code(500).send({error:t})}}),r.post("/list",{schema:{response:{200:_e.object({children:_e.array(_e.object({startedBy:_e.string(),taskId:_e.string(),pid:_e.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:_e.object({sessionId:_e.string()}),response:{200:_e.object({success:_e.boolean()})}}},async e=>{const{sessionId:t}=e.body;return O.debug(`[CONTROL SERVER] Stop session request: ${t}`),{success:n(t)}}),r.post("/stop",{schema:{response:{200:_e.object({status:_e.string()})}}},async()=>(O.debug("[CONTROL SERVER] Stop daemon request received"),setTimeout(()=>{O.debug("[CONTROL SERVER] Triggering daemon shutdown"),t()},50),{status:"stopping"}));const p=e=>new Promise((n,t)=>{o.listen({port:e,host:"127.0.0.1"},(e,a)=>{e?t(e):n(a)})});(async()=>{let e;try{e=await p(30624)}catch(n){const t=n?.code;if("EADDRINUSE"!==t&&"EACCES"!==t)throw O.info("[CONTROL SERVER] Failed to start:",n),n;O.info(`[CONTROL SERVER] Port 30624 unavailable (${t??"error"}), falling back to dynamic port`),e=await p(0)}const n=parseInt(e.split(":").pop());O.info(`[CONTROL SERVER] Started on port ${n}`),i({port:n,stop:async()=>{await o.close(),O.info("[CONTROL SERVER] Server stopped")}})})().catch(e=>{throw O.info("[CONTROL SERVER] Failed to start:",e),e})})}function Dt(e,n={}){const t=j(),a=ve(t,"dist","index.mjs"),s=["--no-warnings","--no-deprecation",a,...e];if(!oe(a)){const e=`Entrypoint ${a} does not exist`;throw O.debug(`[SPAWN Agentrix CLI] ${e}`),new Error(e)}return Ee(process.execPath,s,n)}const Nt=[{version:1,fileName:"001_init.sql"}];function Ot(e){var n;return function(e,n){const t=new We(e),a=new Le;t.pragma("journal_mode = WAL"),function(e){const n=function(){const e=Y(Fe(import.meta.url)),n=[J(e,"migrations"),J(process.cwd(),"dist","migrations"),J(process.cwd(),"src","worker","history","migrations")];for(const e of n)if(z(e))return e;throw new Error(`Task history migrations directory not found at ${n[0]}`)}(),t=e.pragma("user_version",{simple:!0}),a=function(e,n){const t=J(e,n);return B(t,"utf8")}(n,Nt[0].fileName);e.exec(a),t<Nt[0].version&&e.pragma(`user_version = ${Nt[0].version}`)}(t);const s=t.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=t.prepare("SELECT local_sequence FROM task_message WHERE event_id = ?"),o=t.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=t.prepare("\n UPDATE task_event\n SET sequence = ?\n WHERE event_id = ? AND (sequence IS NULL OR sequence < ?)\n "),c=t.prepare("\n SELECT * FROM task_event\n WHERE sequence > ? AND event_type = 'task-message'\n ORDER BY sequence ASC\n LIMIT ?\n "),p=t.prepare("\n SELECT 1 as has_row\n FROM task_event\n WHERE sequence > ? AND event_type = 'task-message'\n LIMIT 1\n "),l=t.prepare("\n SELECT * FROM task_message\n ORDER BY local_sequence DESC\n LIMIT ?\n "),u=t.prepare("\n SELECT * FROM task_message\n WHERE local_sequence > ?\n ORDER BY local_sequence ASC\n LIMIT ?\n "),m=t.prepare("\n SELECT * FROM task_message\n WHERE local_sequence < ?\n ORDER BY local_sequence DESC\n LIMIT ?\n "),g=t.prepare("\n SELECT 1 as has_row\n FROM task_message\n WHERE local_sequence < ?\n LIMIT 1\n "),h=t.prepare("\n SELECT 1 as has_row\n FROM task_message\n WHERE local_sequence > ?\n LIMIT 1\n "),f=t.prepare("\n SELECT * FROM task_message\n WHERE local_sequence > ?\n ORDER BY local_sequence DESC\n LIMIT ?\n "),x=t.prepare("\n SELECT agent_id, session_id, last_sequence\n FROM task_agent_session\n "),v=t.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 "),b=t.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 t=e.eventId??d(),o=(new Date).toISOString();s.run({eventId:t,taskId:n,senderType:e.senderType,senderId:e.senderId,senderName:e.senderName,message:JSON.stringify(e.message),createdAt:o});const r=i.get(t),c=r?.local_sequence??null;return null!==c&&a.emit("message-saved",{eventId:t}),{eventId:t,localSequence:c}},saveTaskEvent:e=>{const n=e.eventId??d(),t=(new Date).toISOString(),a={...e.eventData,eventId:n};return o.run({eventId:n,taskId:e.taskId,chatId:e.chatId,sequence:e.sequence,eventType:e.eventType,eventData:JSON.stringify(a),createdAt:t}),n},updateTaskEventSequence:(e,n)=>{r.run(n,e,n)},pageTaskEventsAfter:(e,n)=>{const t=c.all(e,n).map(qt),a=t.at(-1)?.sequence??null;return{data:t,hasMore:null!==a&&Boolean(p.get(a))}},getLatestTaskEvent:e=>{if(0===e.length)return null;const n=e.map(()=>"?").join(","),a=t.prepare(`\n SELECT * FROM task_event\n WHERE event_type IN (${n})\n ORDER BY created_at DESC, rowid DESC\n LIMIT 1\n `).get(...e);return a?qt(a):null},pageRecentMessages:e=>{const n=l.all(e).map(jt).reverse(),t=n[0]?.localSequence??null;return{data:n,hasMore:!!t&&Boolean(g.get(t))}},pageMessagesAfter:(e,n)=>{const t=u.all(e,n).map(jt),a=t.at(-1)?.localSequence??null;return{data:t,hasMore:!!a&&Boolean(h.get(a))}},pageMessagesBefore:(e,n)=>{const t=m.all(e,n).map(jt).reverse(),a=t[0]?.localSequence??null;return{data:t,hasMore:!!a&&Boolean(g.get(a))}},pageRecentMessagesAfter:(e,n)=>{const t=f.all(e,n).map(jt).reverse(),a=t[0]?.localSequence??null;return{data:t,hasMore:!!a&&Boolean(g.get(a))}},getAgentSessions:()=>{const e=x.all(),n=new Map;for(const t of e)n.set(t.agent_id,t.session_id);return n},getAgentLastSequences:()=>{const e=x.all(),n=new Map;for(const t of e)n.set(t.agent_id,t.last_sequence);return n},upsertAgentSession:(e,t)=>{v.run(e,n,t,(new Date).toISOString())},updateAgentLastSequence:(e,t)=>{b.run(e,n,t,(new Date).toISOString())},on:(e,n)=>{a.on(e,n)},off:(e,n)=>{a.off(e,n)},close:()=>{a.removeAllListeners(),t.close()}}}((n=e.dataDir,J(n,"data.bin")),e.taskId)}function jt(e){const n=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:n,createdAt:e.created_at}}function qt(e){const n=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:n,createdAt:e.created_at}}class Ut{pidToTrackedSession;pidToAwaiter;taskToStartPromise;sandboxPool;constructor(e){this.pidToTrackedSession=new Map,this.pidToAwaiter=new Map,this.taskToStartPromise=new Map,this.sandboxPool=e||null}isProcessAlive(e){try{return process.kill(e,0),!0}catch{return!1}}getAliveSessionByTaskId(e){for(const[n,t]of this.pidToTrackedSession.entries())if(t.taskId===e){if(this.isProcessAlive(n))return t;this.pidToTrackedSession.delete(n)}}getCurrentSessions(){return Array.from(this.pidToTrackedSession.values())}getSessionByPid(e){return this.pidToTrackedSession.get(e)}registerTaskWorker(e,n){const t=n.pid;if(!t)return void O.warn(`[SESSION] Missing PID for task ${e}`);O.info(`[SESSION] Registered task ${e}, PID: ${t}`);const a=this.pidToTrackedSession.get(t);if(a&&a.taskId===e){const e=this.pidToAwaiter.get(t);e&&(this.pidToAwaiter.delete(t),e(a))}else if(!a){const n={startedBy:"cli",taskId:e,pid:t};this.pidToTrackedSession.set(t,n)}}async decryptTaskMessage(e){if(!e.dataEncryptionKey)return;const n=await N.getSecretKey();if(!n)return;const t=l(p(e.dataEncryptionKey),n);if(!t)return void O.warn("[SESSION] Failed to decrypt data encryption key");if(e.dataEncryptionKey=i(t),"task-message"!==e.event)return;const a=e.eventData;if(!a.encryptedMessage)return;const s=f(a.encryptedMessage,t);s?e.eventData={...a,message:s,encryptedMessage:void 0}:O.warn("[SESSION] Failed to decrypt task message")}persistCreateTaskStart(e){const n=Ot({dataDir:N.resolveDataDir(e.userId,e.taskId),taskId:e.taskId});try{const t=e.eventData;n.saveTaskEvent({eventType:e.event,eventId:t.eventId,eventData:t,taskId:e.taskId,chatId:e.chatId,sequence:t.sequence??0}),t.message&&n.saveMessage({eventId:t.eventId,message:t.message,senderType:t.senderType,senderId:t.senderId,senderName:t.senderName})}finally{n.close()}}persistResumeTaskStart(e){const n=Ot({dataDir:N.resolveDataDir(e.userId,e.taskId),taskId:e.taskId}),t=e.eventData.sequence;if(null==t)throw new Error(`Missing resume sequence for task ${e.taskId}`);try{const a=e.eventData;n.saveTaskEvent({eventType:e.event,eventId:a.eventId,eventData:a,taskId:e.taskId,chatId:e.chatId,sequence:t}),a.message&&n.saveMessage({eventId:a.eventId,message:a.message,senderType:a.senderType,senderId:a.senderId,senderName:a.senderName})}finally{n.close()}}trackWorkerProcess(e,n){const t={startedBy:"daemon",pid:n.pid,childProcess:n,taskId:e.taskId};this.pidToTrackedSession.set(n.pid,t),n.on("exit",(t,a)=>{this.pidToTrackedSession.delete(n.pid),this.sandboxPool&&this.sandboxPool.disposeWorkerSandbox(e.taskId)}),n.on("error",t=>{this.pidToTrackedSession.delete(n.pid),this.sandboxPool&&this.sandboxPool.disposeWorkerSandbox(e.taskId)})}async startWorker(e,n){const t={eventId:d(),status:"success",opCode:e.eventId};await this.decryptTaskMessage(e),N.writeTaskInput(e),"create-task"===n?this.persistCreateTaskStart(e):this.persistResumeTaskStart(e);const a=this.taskToStartPromise.get(e.taskId);if(a)return O.info(`[SESSION] Task ${e.taskId} is already starting, skip duplicate ${n}`),a;const s=this.startWorkerInternal(e,n,t).finally(()=>{this.taskToStartPromise.get(e.taskId)===s&&this.taskToStartPromise.delete(e.taskId)});return this.taskToStartPromise.set(e.taskId,s),s}async startWorkerInternal(e,n,t){const a=this.getAliveSessionByTaskId(e.taskId);if(a)return O.info(`[SESSION] Task ${e.taskId} already has worker PID ${a.pid}, skip duplicate ${n}`),t.message=`Worker already running (PID ${a.pid})`,t;const s=N.resolveProjectCWD(e.userCwd,e.userId,e.taskId),i=["worker","--type",e.agentType||"claude","--started-by","daemon","--task-id",e.taskId,"--user-id",e.userId,"--idle-timeout","120"];let o;if(this.sandboxPool?.isEnabled())try{if(!await this.sandboxPool.createWorkerSandbox(e.taskId,e.userId,s))throw new Error("Failed to create sandbox instance");const{projectPath:n}=await import("./logger-BNXbkPSk.mjs").then(function(e){return e.d}),{join:t}=await import("path"),a=["--no-warnings","--no-deprecation",t(n(),"dist","index.mjs"),...i],r=`"${process.execPath}" ${a.map(e=>`"${e}"`).join(" ")}`,c=await this.sandboxPool.wrapWorkerCommand(e.taskId,r);O.debug(`[SESSION] Sandboxed command for task ${e.taskId}: ${c}`),o=Ee(c,{shell:!0,cwd:s,detached:!0,stdio:["ignore","pipe","pipe"],env:{...process.env}}),O.info(`[SESSION] Worker started with sandbox, PID: ${o.pid}`)}catch(n){return O.error(`[SESSION] Failed to setup sandbox for task ${e.taskId}:`,n),t.status="failed",t.message=`Sandbox setup failed: ${n instanceof Error?n.message:String(n)}`,t}else o=Dt(i,{cwd:s,detached:!0,stdio:["ignore","pipe","pipe"],env:{...process.env}}),O.info(`[SESSION] Worker started without sandbox, PID: ${o.pid}`);if(process.env.DEBUG&&(o.stdout?.on("data",e=>{O.debug(`[Daemon] worker stdout: ${e.toString()}`)}),o.stderr?.on("data",e=>{O.debug(`[Daemon] worker stderr: ${e.toString()}`)})),!o.pid)return t.status="failed",t.message="Failed to start worker - no PID",t;O.info(`[SESSION] Worker started, PID: ${o.pid}`),this.trackWorkerProcess(e,o);const[r,c]=function(e){let n,t;const a=new Promise(a=>{n=e=>{clearTimeout(t),a(e)},t=setTimeout(()=>{a(e.onTimeout())},e.timeoutMs)});return[a,n,()=>clearTimeout(t)]}({timeoutMs:15e3,onTimeout:()=>(this.pidToAwaiter.delete(o.pid),t.status="failed",t.message=`Worker timeout (PID ${o.pid})`,t)});return this.pidToAwaiter.set(o.pid,()=>{c(t)}),r}stopSession(e){for(const[n,t]of this.pidToTrackedSession.entries())if(t.taskId===e){try{(t.childProcess?t.childProcess:{kill:e=>process.kill(n,e)}).kill("SIGTERM"),O.info(`[SESSION] Task ${e} stopped`);const a=setTimeout(()=>{const t=this.pidToTrackedSession.get(n);if(t&&t.taskId===e&&this.isProcessAlive(n))try{process.kill(n,"SIGKILL"),O.warn(`[SESSION] Task ${e} did not exit after SIGTERM, sent SIGKILL to PID ${n}`)}catch(t){O.warn(`[SESSION] Failed to force kill task ${e} (PID ${n}):`,t)}},3e3);a.unref?.()}catch(t){O.warn(`[SESSION] Failed to stop task ${e}:`,t),this.isProcessAlive(n)||this.pidToTrackedSession.delete(n)}return!0}return O.warn(`[SESSION] Task ${e} not found`),!1}pruneStaleSessions(){for(const[e,n]of this.pidToTrackedSession.entries())try{process.kill(e,0)}catch(n){this.pidToTrackedSession.delete(e)}}shutdown(){O.info("[SESSION] Shutting down all sessions");for(const[e,n]of this.pidToTrackedSession.entries())try{"daemon"===n.startedBy&&n.childProcess?n.childProcess.kill("SIGTERM"):process.kill(e,"SIGTERM")}catch(n){O.warn(`[SESSION] Failed to stop PID ${e}:`,n)}this.pidToTrackedSession.clear(),this.pidToAwaiter.clear()}async startDeploymentWorker(e){const n={eventId:d(),status:"success",opCode:e.eventId};N.writeTaskInput(e);try{const t=Dt(["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&&(t.stdout?.on("data",e=>{O.debug(`[Deployment] worker stdout: ${e.toString()}`)}),t.stderr?.on("data",e=>{O.debug(`[Deployment] worker stderr: ${e.toString()}`)})),!t.pid)return n.status="failed",n.message="Failed to start deployment worker - no PID",n;O.info(`[SESSION] Deployment worker started, PID: ${t.pid}`);const a={taskId:e.taskId,userId:e.userId};return this.trackWorkerProcess(a,t),n}catch(e){return n.status="failed",n.message=`Failed to start deployment worker: ${e instanceof Error?e.message:String(e)}`,n}}}class Gt{networkManager=null;workerSandboxes=new Map;settings=null;platform;constructor(){this.platform=Re()}async initialize(e){if(this.settings=e,!e.enabled)return O.info("[SANDBOX] Sandbox disabled via settings"),!1;if(!Be(this.platform))return O.warn("[SANDBOX] Platform not supported, sandbox disabled"),!1;try{const n={allowedDomains:[new URL(N.serverUrl).hostname,...e.network.allowedDomains],deniedDomains:e.network.deniedDomains,allowLocalBinding:!1};return this.networkManager=new ze,await this.networkManager.initialize(n),O.info("[SANDBOX] Sandbox pool initialized successfully"),!0}catch(e){throw O.error("[SANDBOX] Failed to initialize:",e),e}}async createWorkerSandbox(e,n,t){if(!this.networkManager||!this.settings?.enabled)return null;try{const a=N.resolveUserWorkSpaceDir(n),s=N.getStatePaths().logsDir,i=this.settings.filesystem||{},o=this.settings.env||{},r={...i,allowWrite:[...i.allowWrite||[],a,t,s]};if("linux"===this.platform&&i.allowRead){const e=X.dirname(process.execPath);r.allowRead=[...i.allowRead,e]}const c={filesystem:r,env:o},p=new Ke(this.networkManager,c);return this.workerSandboxes.set(e,p),O.info(`[SANDBOX] Created sandbox for task ${e}`),p}catch(n){return O.error(`[SANDBOX] Failed to create sandbox for task ${e}:`,n),null}}async wrapWorkerCommand(e,n){const t=this.workerSandboxes.get(e);if(!t)throw new Error(`No sandbox found for task ${e}`);const a=await t.wrapWithSandbox(n);return O.debug(`[SANDBOX] Wrapped command for task ${e}`),a}disposeWorkerSandbox(e){const n=this.workerSandboxes.get(e);n&&(n.dispose(),this.workerSandboxes.delete(e),O.debug(`[SANDBOX] Disposed sandbox for task ${e}`))}async shutdown(){O.info("[SANDBOX] Shutting down sandbox pool");for(const[e,n]of this.workerSandboxes.entries())n.dispose(),O.debug(`[SANDBOX] Disposed sandbox for task ${e}`);this.workerSandboxes.clear(),this.networkManager&&(await this.networkManager.shutdown(),this.networkManager=null,O.info("[SANDBOX] Network manager shutdown complete"))}isEnabled(){return!0===this.settings?.enabled}}class Lt{constructor(e,n){this.client=e,this.machineId=n;const t=N.agentrixAgentsHomeDir,a=ve(t,"companion","claude");this.stateFilePath=ve(a,"state.json")}timer=null;initialDelay=null;intervalMs=9e5;enabled=!1;heartbeatTaskId=null;companionState=null;stateFilePath;start(){this.loadState(),this.companionState?O.info(`[COMPANION SCHEDULER] Ready: agent=${this.companionState.agentId}, chatId=${this.companionState.chatId}`):O.warn("[COMPANION SCHEDULER] No state.json found (companion not registered yet), will keep checking"),O.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),O.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),O.info("[COMPANION SCHEDULER] Cleared heartbeat task ID")}loadState(){try{if(oe(this.stateFilePath)){this.companionState=JSON.parse(re(this.stateFilePath,"utf-8"));const e=this.companionState?.heartbeatIntervalMs??9e5;e!==this.intervalMs&&(O.info(`[COMPANION SCHEDULER] Interval changed: ${this.intervalMs}ms → ${e}ms`),this.intervalMs=e),this.enabled=this.companionState?.heartbeatEnabled??!1,this.heartbeatTaskId=this.companionState?.heartbeatTaskId??null,O.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){O.warn("[COMPANION SCHEDULER] Failed to load state.json",e)}}saveStateField(e,n){try{let t={};oe(this.stateFilePath)&&(t=JSON.parse(re(this.stateFilePath,"utf-8"))),void 0===n?delete t[e]:t[e]=n;const a=be(this.stateFilePath);oe(a)||le(a,{recursive:!0}),pe(this.stateFilePath,JSON.stringify(t,null,2),"utf-8"),O.debug(`[COMPANION SCHEDULER] Saved state field: ${e}=${n??"removed"}`)}catch(n){O.warn(`[COMPANION SCHEDULER] Failed to save state field: ${e}`,n)}}tick(){if(this.loadState(),!this.companionState)return void O.debug("[COMPANION SCHEDULER] Still no state.json, skipping heartbeat");if(!this.enabled)return void O.debug("[COMPANION SCHEDULER] Heartbeat disabled, skipping");const e=this.companionState;this.heartbeatTaskId?(O.debug(`[COMPANION SCHEDULER] Sending heartbeat to existing task ${this.heartbeatTaskId}`),this.client.send("task-message",{eventId:d(),taskId:this.heartbeatTaskId,chatId:e.chatId,from:"machine",message:{type:"companion_heartbeat",timestamp:(new Date).toISOString()},senderType:"system",senderId:"system",senderName:"system"})):(O.debug("[COMPANION SCHEDULER] Requesting new heartbeat task"),this.client.send("request-companion-heartbeat",{eventId:d(),machineId:e.machineId,agentId:e.agentId,chatId:e.chatId,userId:e.userId,timestamp:(new Date).toISOString()}))}}async function Wt(){Object.assign(O,U({type:"daemon"}));const{requestShutdown:e,shutdownPromise:n}=function(){const{processType:e,onShutdownRequest:n}={processType:"daemon"},t=`[${e.toUpperCase()}]`;let a;const s=new Promise(e=>{a=(a,s)=>{O.info(`${t} Requesting shutdown (source: ${a}, errorMessage: ${s})`),n&&n(a,s),setTimeout(()=>process.exit(1),1e3),e({source:a,errorMessage:s})}}),i=e=>{process.on(e,()=>{a("os-signal")})};return i("SIGINT"),i("SIGTERM"),process.on("uncaughtException",e=>{O.info(`${t} FATAL: Uncaught exception`,e),O.info(`${t} Stack trace: ${e.stack}`),a("exception",e.message)}),process.on("unhandledRejection",e=>{O.info(`${t} FATAL: Unhandled promise rejection`,e);const n=e instanceof Error?e:new Error(`Unhandled promise rejection: ${e}`);O.info(`${t} Stack trace: ${n.stack}`),a("exception",n.message)}),process.on("exit",e=>{O.info(`${t} Process exiting with code: ${e}`)}),{requestShutdown:a,shutdownPromise:s}}();console.log("[DAEMON RUN] Starting daemon process..."),O.debug("[DAEMON RUN] Environment",st()),await gn()&&(console.log("Daemon already running..."),process.exit(0));let t=await N.acquireDaemonLock(5,200);for(;!t;)await fn(),t=await N.acquireDaemonLock(5,200),t||(O.debug("[DAEMON RUN] cannot acquire daemon lock..."),process.exit(1));try{(function(){if(N.disableCaffeinate)return O.debug("[caffeinate] Caffeinate disabled via AGENTRIX_DISABLE_CAFFEINATE environment variable"),!1;if("darwin"!==process.platform)return O.debug("[caffeinate] Not on macOS, skipping caffeinate"),!1;if(Jn&&!Jn.killed)return O.debug("[caffeinate] Caffeinate already running"),!0;try{return Jn=Ee("caffeinate",["-im"],{stdio:"ignore",detached:!1}),Jn.on("error",e=>{O.debug("[caffeinate] Error starting caffeinate:",e),Jn=null}),Jn.on("exit",(e,n)=>{O.debug(`[caffeinate] Process exited with code ${e}, signal ${n}`),Jn=null}),O.info(`[caffeinate] Started with PID ${Jn.pid}`),function(){if(Zn)return;Zn=!0;const e=()=>{Qn()};process.on("exit",e),process.on("SIGINT",e),process.on("SIGTERM",e),process.on("SIGUSR1",e),process.on("SIGUSR2",e),process.on("uncaughtException",n=>{O.debug("[caffeinate] Uncaught exception, cleaning up:",n),e()}),process.on("unhandledRejection",(n,t)=>{O.debug("[caffeinate] Unhandled rejection, cleaning up:",n),e()})}(),!0}catch(e){return O.info("[caffeinate] Failed to start caffeinate:",e),!1}})()&&O.debug("[DAEMON RUN] Sleep prevention enabled");const a=await bn();O.debug("[DAEMON RUN] Auth and machine setup complete");const s=new Gt;await s.initialize(N.getSandboxSettings());const i=new Ut(s),{port:o,stop:r}=await _t({getChildren:()=>i.getCurrentSessions(),stopSession:e=>i.stopSession(e),requestShutdown:()=>e("agentrix-cli"),registerSession:(e,n)=>i.registerTaskWorker(e,n),machineId:a.machineId});try{await rt(),O.debug("[DAEMON RUN] Openers detected")}catch(e){O.warn("[DAEMON RUN] Failed to detect openers",e)}const c={pid:process.pid,port:o,startTime:(new Date).toLocaleString(),cliVersion:q.version,logPath:G({type:"daemon"})};N.writeDaemonState(c),O.debug("[DAEMON RUN] Daemon state written");const p=new Xn({machineId:a.machineId,serverUrl:N.serverUrl.replace(/^http/,"ws"),path:"/v1/ws",auth:x(a.token,a.machineId),keepAliveConfig:{intervalMs:2e4,event:"machine-alive",payloadGenerator:()=>({eventId:d(),machineId:a.machineId,timestamp:Date.now().toString(),controlPort:o})},healthCheckConfig:{enabled:!0,intervalMs:3e4,timeoutMs:5e3},logger:(e,...n)=>O.debug(`[DAEMON SOCKET] ${e}`,...n)},i,{requestShutdown:e});await p.connect(),O.info("[DAEMON RUN] Machine client connected to server");const l=new Lt(p.client,a.machineId);l.start(),p.client.onEvent("companion-heartbeat-response",e=>{e?.taskId&&l.setHeartbeatTaskId(e.taskId)});const u=async(e,n)=>{l.stop(),await p.disconnect(),await r(),await s.shutdown(),await hn(),await Qn(),await N.releaseDaemonLock(t),O.info("[DAEMON RUN] Cleanup completed, exiting process"),process.exit(0)};O.info("[DAEMON RUN] Daemon started successfully, waiting for shutdown request");const m=await n;await u(m.source,m.errorMessage)}catch(e){(function(e){return e instanceof Error&&e.message.includes("Machine binding revoked")})(e)&&(console.error("Machine binding is no longer valid."),console.error("Run `agentrix logout` and bind this machine again.")),O.info("[DAEMON RUN][FATAL] Failed somewhere unexpectedly - exiting with code 1",e),process.exit(1)}}const Ft={".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"};async function Ht(e,n,t=!1){try{const a=function(e){try{const n=new URL(e),t=Ie(n.pathname);if(t)return t;const a=n.searchParams.get("filename")||n.searchParams.get("name")||n.searchParams.get("file");if(a){const e=Ie(a);if(e)return e}return""}catch{return""}}(e)||"";let s;if(t)try{const n=new URL(e).pathname,t=ye(n);s=t&&Ie(t)?t:`${$()}${a||".dat"}`}catch{s=`${$()}${a||".dat"}`}else s=`${$()}${a||".dat"}`;const i=ve(n,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()||function(e){const n=e.toLowerCase();return Ft[n]||"application/octet-stream"}(a),p=o.body,l=ge(i);return await Ve(p,l),{filePath:i,mimeType:c,filename:s}}catch(n){throw new Error(`Failed to download file from ${e}: ${n instanceof Error?n.message:String(n)}`)}}const Bt={senderType:"system",senderId:"system",senderName:"system"};class zt{client;context;historyDb;getPermissionMode;outbox=new Map;hasConnectedOnce=!1;constructor(e,n){const{taskId:t,userId:a,machineId:s,cwd:i,chatId:o,...r}=e,c=i.endsWith("/")?i:`${i}/`;this.client=new wn(r),this.context={taskId:t,chatId:o,userId:a,machineId:s,cwd:c,stopTask:n.stopTask,shouldPersistTaskMessage:n.shouldPersistTaskMessage,onTaskMessage:n.onTaskMessage,onTaskInfoUpdate:n.onTaskInfoUpdate,onWorkerStatusRequest:n.onWorkerStatusRequest,onSubTaskResultUpdated:n.onSubTaskResultUpdated,onGitPush:n.onGitPush,dataEncryptionKey:e.dataEncryptionKey},this.historyDb=n.historyDb,this.getPermissionMode=n.getPermissionMode,this.initHandlers()}getPermissionModeSnapshot(){return this.getPermissionMode?.()??null}connect(){return new Promise((e,n)=>{const t=setTimeout(()=>{n(new Error("Worker connection timeout after 10 seconds"))},1e4);this.client.onLifecycle("connect",()=>{clearTimeout(t),e()}),this.client.onLifecycle("connect_error",e=>{clearTimeout(t),n(e)}),this.client.connect()})}async disconnect(){this.client.connected&&await this.client.flush(5e3).catch(()=>{}),this.client.disconnect()}sendTaskMessage(e,n,t){const a=d();return this.historyDb.saveMessage({eventId:a,message:n,senderType:e.senderType,senderId:e.senderId,senderName:e.senderName}),this.sendTaskEvent(e,n,t),a}sendWorkerInitializing(e){const n={eventId:d(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),cwd:this.context.cwd,...void 0!==e?.deployingAgent&&{deployingAgent:e.deployingAgent},...void 0!==e?.upgradingAgent&&{upgradingAgent:e.upgradingAgent}};this.client.send("worker-initializing",n)}sendWorkerInitialized(){const e={eventId:d(),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 n=this.getPermissionModeSnapshot(),t={eventId:d(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),...void 0!==e&&{duration:e},...null!==n&&{permissionMode:n}};this.client.send("worker-ready",t)}sendWorkRunning(e){const n=this.getPermissionModeSnapshot(),t={eventId:d(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),activeAgents:e,...null!==n&&{permissionMode:n}};this.client.send("worker-running",t)}sendPermissionMode(e){const n={eventId:d(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),permissionMode:e};this.client.send("worker-permission-mode",n)}sendWorkerExit(e){const n={eventId:d(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),reason:e};this.client.send("worker-exit",n)}async sendErrorMessageAndExit(e){this.sendSystemErrorMessage(e),await this.client.flush(2e3),this.sendWorkerExit("error"),await this.disconnect()}sendSystemErrorMessage(e,n){const t={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(Bt,t,{groupId:n?.groupId})}sendAssistantMessage(e,n){const t={type:"assistant",session_id:"",uuid:crypto.randomUUID(),parent_tool_use_id:null,message:{role:"assistant",content:[{type:"text",text:e}]}};this.sendTaskEvent(Bt,t,{groupId:n?.groupId})}sendAskUser(e,n,t){return this.sendTaskMessage(e,{type:"ask_user",questions:n},{groupId:t?.groupId})}sendAskUserResponse(e,n){return this.sendTaskMessage(Bt,n,{opCode:e})}sendTaskEvent(e,n,t){const{eventId:a,opCode:s,artifacts:i,navigateToTaskId:o}=t||{},r=a??d(),c={eventId:r,taskId:this.context.taskId,chatId:this.context.chatId,from:"worker",messageType:n.type,message:n,encryptedMessage:void 0,opCode:s,groupId:t?.groupId,senderType:e.senderType,senderId:e.senderId,senderName:e.senderName,artifacts:i,navigateToTaskId:o};if(this.historyDb.saveTaskEvent({eventType:"task-message",eventId:r,eventData:c,taskId:this.context.taskId,chatId:this.context.chatId,sequence:"number"==typeof c.sequence?c.sequence:null}),this.context.dataEncryptionKey){const e=v(n,this.context.dataEncryptionKey);c.message=void 0,c.encryptedMessage=e}return this.outbox.set(r,c),this.client.send("task-message",c),r}sendUpdateTaskAgentSessionId(e){const n={eventId:d(),taskId:this.context.taskId,agentSessionId:e,cwd:this.context.cwd};this.client.send("update-task-agent-session-id",n)}sendTaskSlashCommandsUpdate(e,n){const t={eventId:d(),taskId:this.context.taskId,commands:e,version:n,updatedAt:(new Date).toISOString()};this.client.send("task-slash-commands-update",t)}sendChangeTaskTitle(e){const n={eventId:d(),taskId:this.context.taskId,title:e};this.client.send("change-task-title",n),O.info(`[AGENT] Title changed to: ${e}`)}sendUpdateAgentInfo(e,n){const t={eventId:d(),taskId:this.context.taskId,agentId:e,...n};this.client.send("update-agent-info",t),O.info(`[AGENT] Agent info updated: ${JSON.stringify(n)}`)}sendResetTaskSession(){const e={eventId:d(),taskId:this.context.taskId};this.client.send("reset-task-session",e),O.info(`[AGENT] Session reset requested for task ${this.context.taskId}`)}async sendMergeRequest(e,n){const t={eventId:d(),taskId:this.context.taskId,summary:e,description:n};O.info(`[MERGE] Sending merge-request event for task ${this.context.taskId}`);const a=await this.client.sendWithAck("merge-request",t);if(!a.success)throw new Error(`Failed to create pull request: ${a.error||"Unknown error"}`);return O.info(`[MERGE] Pull request created: #${a.data.pullRequestNumber}`),{pullRequestNumber:a.data.pullRequestNumber,pullRequestUrl:a.data.pullRequestUrl}}async sendMergePr(){const e={eventId:d(),taskId:this.context.taskId,mergeMethod:"squash"};return O.info(`[MERGE-PR] Sending merge-pr event for task ${this.context.taskId}`),await this.client.sendWithAck("merge-pr",e)}associateRepository(e,n,t,a){const s={eventId:d(),taskId:this.context.taskId,gitServerHost:e,owner:n,repo:t,remoteUrl:a};O.info(`[REPO] Sending repository association request: ${e}/${n}/${t}`),this.client.send("associate-repo",s)}async dispatchTaskMessage(e){await this.context.onTaskMessage(e)}initHandlers(){const e=(n=this.context,t=this.historyDb,a=e=>{this.client.send("event-ack",{eventId:d(),status:"success",opCode:e})},{"cancel-task":async e=>{e.taskId===n.taskId&&(O.info(`[WORKER] Task ${n.taskId} cancelled`),await n.stopTask())},"stop-task":async e=>{e.taskId===n.taskId&&(O.info(`[WORKER] Task ${n.taskId} stopped: ${e.reason||"no reason"}`),await n.stopTask())},"task-message":async e=>{if(e.taskId!==n.taskId)return;let s=e.message??null;if(!s&&e.encryptedMessage&&n.dataEncryptionKey&&(s=f(e.encryptedMessage,n.dataEncryptionKey)??null),!s)return;const i={senderType:e.senderType,senderId:e.senderId,senderName:e.senderName};if(n.attachmentsDir&&b(s)&&(s=await async function(e,n){const{attachmentsDir:t,log:a}=n;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?async function(e,n){try{n?.("info","IMAGE",`Downloading image from: ${e.source.url}`);const t=await fetch(e.source.url);if(!t.ok)return n?.("error","IMAGE",`Failed to download image: ${t.statusText}`),e;const a=await t.arrayBuffer(),s=Buffer.from(a),i=s.toString("base64");let o=t.headers.get("content-type")||"image/jpeg";if(!o.startsWith("image/")){const n=e.source.url.toLowerCase();o=n.endsWith(".png")?"image/png":n.endsWith(".gif")?"image/gif":n.endsWith(".webp")?"image/webp":"image/jpeg"}return n?.("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(t){return n?.("error","IMAGE",`Error processing image: ${t}`),e}}(e,a):"document"===e.type&&"url"===e.source?.type&&e.source?.url?async function(e,n,t){try{const a=e.source.url;t?.("info","DOCUMENT",`Downloading document from: ${a}`);const{filePath:s,mimeType:i,filename:o}=await Ht(a,n,!0);return t?.("info","DOCUMENT",`Document downloaded to: ${s}`),{type:"text",text:`Document: ${s}\nTitle: ${e.title||o}\nType: ${i}`}}catch(n){return t?.("error","DOCUMENT",`Error processing document: ${n}`),e}}(e,t,a):e));return{...e,message:{...e.message,content:s}}}(s,{attachmentsDir:n.attachmentsDir,log:n.logger})),n.shouldPersistTaskMessage&&!await n.shouldPersistTaskMessage(s,i))return void O.debug(`[WORKER] Dropping incoming task-message before persistence: eventId=${e.eventId}`);const o={...e,message:s,encryptedMessage:void 0,chatId:e.chatId??n.chatId};t.saveTaskEvent({eventType:"task-message",eventId:e.eventId,eventData:o,taskId:n.taskId,chatId:e.chatId??n.chatId,sequence:e.sequence??null}),t.saveMessage({eventId:e.eventId,message:s,senderType:e.senderType,senderId:e.senderId,senderName:e.senderName}),a(e.eventId),n.onTaskMessage&&await n.onTaskMessage(s,i)},"task-info-update":async e=>{e.taskId===n.taskId&&n.onTaskInfoUpdate&&await n.onTaskInfoUpdate(e)},"worker-status-request":async e=>{e.taskId===n.taskId&&n.onWorkerStatusRequest&&await n.onWorkerStatusRequest(e)},"sub-task-result-updated":async e=>{e.parentTaskId===n.taskId&&n.onSubTaskResultUpdated&&await n.onSubTaskResultUpdated(e)}});var n,t,a;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 n=e.data?.sequence;void 0!==e.opCode&&this.outbox.delete(e.opCode),void 0!==e.opCode&&"number"==typeof n&&this.historyDb.updateTaskEventSequence(e.opCode,n)}),this.client.onLifecycle("connect",()=>{if(this.hasConnectedOnce){if(this.outbox.size>0){O.info(`[WORKER] Reconnected — flushing ${this.outbox.size} outbox message(s)`);for(const e of this.outbox.values())this.client.send("task-message",e)}}else this.hasConnectedOnce=!0})}}class Kt{logger;socketClient;taskId;userId;chatId;rootTaskId;parentTaskId;workingDirectory;taskAgents;serverUrl;taskDataKey;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,this.taskDataKey=e.taskDataKey}async call(e,n,t){const a=d();try{const s=await this.socketClient.sendWithAck("rpc-call",{eventId:a,taskId:this.taskId,method:e,path:n,query:t?.query,body:t?.body});if(!s.success){const t=s.error||{code:"unknown",message:"Unknown error"};throw new Error(`RPC ${e} ${n} failed: ${t.message} (${t.code})`)}return s.data}catch(t){throw new Error(`RPC ${e} ${n} error: ${t.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,n){return this.call("PATCH",`/v1/draft-agent/${e}`,{body:n})}async startSubTask(e){const n={userId:this.userId,chatId:this.chatId,agentId:e.agentId,parentTaskId:this.taskId,customTitle:e.title,cwd:e.cwd,forceUserCwd:e.forceUserCwd};return this.taskDataKey?n.encryptedMessage=v(e.message,this.taskDataKey):n.message=e.message,{taskId:(await this.call("POST","/v1/tasks/start",{body:n})).taskId}}async startIndependentTask(e){const n={userId:this.userId,chatId:this.chatId,agentId:e.agentId,sourceTaskId:this.taskId,customTitle:e.title,cwd:e.cwd,forceUserCwd:e.forceUserCwd,autoNavigate:e.autoNavigate};return this.taskDataKey?n.encryptedMessage=v(e.message,this.taskDataKey):n.message=e.message,{taskId:(await this.call("POST","/v1/tasks/start",{body:n})).taskId}}async startGroupTask(e){const n={userId:this.userId,chatId:this.chatId,parentTaskId:this.taskId,customTitle:e.title,todos:e.todos};return this.taskDataKey?n.encryptedMessage=v(e.message,this.taskDataKey):n.message=e.message,{taskId:(await this.call("POST","/v1/tasks/start",{body:n})).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 n=await this.call("GET","/v1/tasks/find-by-agent",{query:{parentTaskId:this.taskId,agentId:e}});return n.taskId?{taskId:n.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 listAgents(){return this.call("GET","/v1/user-agents")}async uploadFile(e){this.logger.info("[Agent-Context] Uploading file...");const n=await F.promises.stat(e.path);this.logger.info("[Agent-Context] file stats");const t=n.size,a=e.contentType||Rn.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 F.promises.readFile(e.path),r=await fetch(i,{method:"PUT",headers:{"Content-Type":a},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:t,contentType:a,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:t,contentType:a,url:c}}}function Vt(e,n){const t=e.split("\n");return t.length<=n?e:t.slice(0,n).join("\n")+"..."}function Xt(e,n){let t=e.resultMessage;if(0===t.result.trim().length&&e.encryptedResultMessage&&n){const a=f(e.encryptedResultMessage,n);a&&"result"===a.type&&(t={type:"result",result:"result"in a?a.result:"",is_error:a.is_error})}const a={...e,resultMessage:{...t,result:Vt(t.result,3)}};let s=`<sub-task-result-updated>\n${JSON.stringify(a,null,2)}\n</sub-task-result-updated>`;return s+=t.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 Jt(){const e=new Set;return{filter(n){const t=n;if(!t.message||!t.message.content||"string"==typeof t.message.content)return n;const a=t.message.content.filter(n=>!("tool_result"===n.type&&e.has(n.tool_use_id)||"user"===t.type&&"tool_result"!==n.type));return 0===a.length?null:(t.message.content=a,t)},clear(){e.clear()}}}function Yt(e){const n=aa(e);return n?{type:"user",message:{role:"user",content:[{type:"text",text:`<msg ${Zt({seq:n.seq.toString(),at:n.at,senderType:n.senderType??void 0,senderId:n.senderId??void 0,senderName:n.senderName??void 0})}>${n.text}</msg>\n`},...n.nonTextBlocks]},parent_tool_use_id:null,session_id:""}:null}function Qt(e){const n=aa(e);return n?`<msg ${Zt({seq:n.seq.toString(),at:n.at,senderType:n.senderType??void 0,senderId:n.senderId??void 0,senderName:n.senderName??void 0})}>\n${n.text}\n</msg>`:null}function Zt(e){return Object.entries(e).filter(([,e])=>void 0!==e&&""!==e).map(([e,n])=>`${e}="${function(e){return e.replaceAll("&","&").replaceAll('"',""").replaceAll("<","<").replaceAll(">",">")}(n)}"`).join(" ")}function ea(e){const n=[];for(const t of e){const e=Qt(t);e&&n.push(e)}return n.join("\n")}function na(e){return`Ask user: ${e.questions.map((e,n)=>{const t=e.options?.map(e=>e.label).filter(Boolean),a=t&&t.length>0?` options: ${t.join(", ")}`:"";return`Q${n+1}[${e.header}] ${e.question}${a}`}).join(" | ")}`}function ta(e){const n=e.status?` status=${e.status}`:"",t=e.reason?` reason=${e.reason}`:"",a=e.answers?.length?e.answers.join(", "):"no answers",s=e.details?.filter(Boolean).join(" | ");return`Ask user response:${n}${t} answers: ${a}${s?` details: ${s}`:""}`}function aa(e){const{text:n,nonTextBlocks:t}=(a=e.message,y(a)?{text:na(a),nonTextBlocks:[]}:w(a)?{text:ta(a),nonTextBlocks:[]}:k(a)?function(e){switch(e.type){case"user":case"assistant":return function(e){if("string"==typeof e)return{text:e,nonTextBlocks:[]};if(Array.isArray(e)){const n=[],t=[];for(const a of e)"text"!==a.type||"string"!=typeof a.text?t.push(a):n.push(a.text);return{text:n.join("\n"),nonTextBlocks:t}}return{text:"",nonTextBlocks:[]}}(e.message.content);case"result":if("success"===e.subtype)return{text:e.result,nonTextBlocks:[]}}return{text:"",nonTextBlocks:[]}}(a):{text:"",nonTextBlocks:[]});var a;return n?{seq:e.localSequence,at:e.createdAt,senderType:e.senderType,senderId:e.senderId,senderName:e.senderName,text:n,nonTextBlocks:t}:null}function sa({workClient:e}){return Xe("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:_e.string().describe("New title for the task")},async n=>(e.sendChangeTaskTitle(n.title),{content:[{type:"text",text:`Task title updated to: ${n.title}`}]}))}function ia({agentContext:e,log:n}){return Xe("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:_e.string().describe("Sub-task ID to send follow-up instructions to"),instructions:_e.string().describe("Additional instructions for the sub-task")},async t=>{try{return await e.sendMessage({taskId:t.taskId,message:{type:"user",message:{role:"user",content:t.instructions}},target:"agent"}),{content:[{type:"text",text:`Sent follow-up instructions to sub-task ${t.taskId}.`}]}}catch(e){return n("error","TASK",`Failed to send follow-up to sub-task ${t.taskId}:`,e),{content:[{type:"text",text:`Failed to send follow-up to sub-task: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function oa({historyDb:e}){return Xe("get_task_history","Retrieve earlier task history stored locally for additional context.",{sequence:_e.number().int().describe("Return messages before this local sequence (exclusive)."),limit:_e.number().int().min(1).max(50).default(20).describe("Maximum number of messages to return.")},async n=>{const t=n.limit??20,a=e.pageMessagesBefore(n.sequence,t);return 0===a.data.length?{content:[{type:"text",text:"No earlier messages found."}]}:{content:[{type:"text",text:ea(a.data)}]}})}function ra({agentContext:e}){return Xe("get_task_agents","List the agents available for the current task and return taskAgents info.",{},async()=>{const n=e.getTaskAgents();return n.length?{content:[{type:"text",text:JSON.stringify(n,null,2)}]}:{content:[{type:"text",text:"No task agents available."}]}})}function ca({agentContext:e,log:n}){return Xe("list_sub_task","List direct sub tasks for the current task with taskId, title, and cwd.",{},async()=>{try{const n=await e.listSubTasks();return n.length?{content:[{type:"text",text:JSON.stringify(n,null,2)}]}:{content:[{type:"text",text:"No sub tasks found."}]}}catch(e){return n("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 pa({agentContext:e,agentId:n,log:t,setPendingNavigateTaskId:a}){return Xe("create_task","Delegate a task to an agent for execution.\n\n**Modes**:\n- Sub-task (default): Creates under current task, linked via parentTaskId.\n- Independent (independent=true): Creates a top-level task with no parent binding. Optionally set autoNavigate=true to auto-switch the user's App UI to the new task.\n\nIf agentId is provided, delegates to that specific agent. Otherwise, creates a task for yourself.\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.",{agentId:_e.string().optional().describe('Target agent ID (e.g., "agent-poster-generator"). If not provided, uses current agent.'),title:_e.string().min(1).max(200).describe("Task title for the agent to use (required)"),instructions:_e.string().describe("Detailed instructions for the agent. Be specific about what needs to be done."),briefSummary:_e.string().describe('One-line summary shown to user immediately (e.g., "Creating login page")'),cwd:_e.string().optional().describe("Working directory for the task. Pass your current cwd when the sub-task needs to read/write the same project files as you. If omitted, a new isolated workspace is created (scoped by taskId)."),useWorktree:_e.boolean().optional().describe("Whether to create a git worktree for isolation. Defaults to false (work in-place)."),independent:_e.boolean().optional().describe("Create as independent top-level task (no parent). Defaults to false (sub-task mode)."),autoNavigate:_e.boolean().optional().describe("Auto-switch App UI to this task after creation. Only works with independent=true. Defaults to false.")},async s=>{try{if(s.autoNavigate&&!s.independent)return{content:[{type:"text",text:"Error: autoNavigate can only be used with independent=true"}],isError:!0};const i=s.agentId||n;let o;return s.independent?(o=await e.startIndependentTask({agentId:i,message:{type:"user",message:{role:"user",content:s.instructions}},title:s.title,cwd:s.cwd,forceUserCwd:!s.useWorktree,autoNavigate:s.autoNavigate}),s.autoNavigate&&a(o.taskId),t("info","TASK",`Created independent task ${o.taskId} for agent ${i} (autoNavigate: ${s.autoNavigate??!1})`)):(o=await e.startSubTask({agentId:i,message:{type:"user",message:{role:"user",content:s.instructions}},title:s.title,cwd:s.cwd,forceUserCwd:!s.useWorktree}),t("info","TASK",`Created sub-task ${o.taskId} for agent ${i}`)),{content:[{type:"text",text:`🚀 Task created: ${o.taskId}\n${s.agentId?`Agent: ${i}\n`:""}${s.independent?"Mode: Independent\n":""}Summary: ${s.briefSummary}\n\nYou'll receive a <sub-task-result-updated> notification when the task completes. Continue responding to the user.`}]}}catch(e){return t("error","TASK","Failed to create task:",e),{content:[{type:"text",text:`Failed to create task: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function la({agentContext:e,log:n}){return Xe("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:_e.string().min(1).max(200).describe("Task title"),instructions:_e.string().describe("Instructions for the owner agent"),briefSummary:_e.string().optional().describe("One-line summary shown to user immediately"),agentId:_e.string().describe("Target agent ID"),cwd:_e.string().optional().describe("Working directory for the sub-task. Pass your current cwd when the sub-task needs to read/write the same project files as you. If omitted, a new isolated workspace is created (scoped by sub-task taskId)."),useWorktree:_e.boolean().optional().describe("Whether to create a git worktree for isolation. Defaults to false (work in-place).")},async t=>{try{return{content:[{type:"text",text:`🚀 Task created: ${(await e.startSubTask({agentId:t.agentId,message:{type:"user",message:{role:"user",content:t.instructions}},title:t.title,cwd:t.cwd,forceUserCwd:!t.useWorktree})).taskId}\n${t.briefSummary?`Summary: ${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","Create solo task failed:",e),{content:[{type:"text",text:`Create solo task failed: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function da({agentContext:e,log:n,agentId:t}){return Xe("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:_e.string().min(1).max(200).describe("Task title"),requirement:_e.string().describe("Overall requirement"),briefSummary:_e.string().optional().describe("One-line summary shown to user immediately"),todos:_e.array(_e.object({agentId:_e.string().describe("Agent ID responsible for the todo"),title:_e.string().min(1).max(200).describe("Todo title"),instructions:_e.string().describe("Detailed instructions for this todo")})).min(1).describe("Todo list for agents")},async t=>{try{return{content:[{type:"text",text:`🚀 Task created: ${(await e.startGroupTask({title:t.title,todos:t.todos,message:{type:"user",message:{role:"user",content:t.requirement}}})).taskId}\n${t.briefSummary?`Summary: ${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","DISPATCH","Dispatch failed:",e),{content:[{type:"text",text:`Dispatch failed: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function ua({askUser:e,log:n}){return Xe("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:_e.array(_e.object({question:_e.string().describe("The complete question to ask the user"),header:_e.string().max(12).describe("Short label displayed as a chip/tag (max 12 chars)"),multiSelect:_e.boolean().describe("Set to true to allow multiple option selections"),options:_e.array(_e.object({label:_e.string().describe("Option label (1-5 words)"),description:_e.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 t=>{try{const n=t.questions.map(e=>({...e,options:[...e.options,{label:"Other",description:""}]})),a=await e(n);return"answered"!==(a.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${a.answers.map(e=>e.startsWith("other:")?`Other: "${e.slice(6)}"`:e).join("\n")}`}]}}catch(e){return n("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 ma({invokeAgent:e}){return Xe("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:_e.string().describe("Target agent ID"),hint:_e.string().optional().describe("Optional context/instruction for the agent")},async n=>(e(n.agentId,n.hint),{content:[{type:"text",text:`Invoked ${n.agentId}. The agent will respond in the chat later.`}]}))}function ga({workClient:e,agentId:n,uploadFile:t,log:a}){return Xe("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:_e.string().optional().describe("Your display name"),avatarPath:_e.string().optional().describe("Local path to avatar image file (png/jpg/svg)"),signature:_e.string().optional().describe("Short status line or tagline shown under your name")},async s=>{let i;if(s.avatarPath)try{i=(await t({name:"avatar.png",path:s.avatarPath,visibility:"public"})).fileId}catch(e){return a("error","TOOL","Avatar upload failed:",e),{content:[{type:"text",text:`Avatar upload failed: ${e}`}],isError:!0}}e.sendUpdateAgentInfo(n,{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 ha({assign:e,log:n}){return Xe("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:_e.string().describe("Target agent ID"),instruction:_e.string().describe("Task instruction for the agent"),acknowledgment:_e.string().optional().describe('Agent\'s quick reply shown immediately (e.g., "starting now", "On it")')},async n=>(e(n.agentId,n.instruction,n.acknowledgment),{content:[{type:"text",text:`Assigned work to ${n.agentId}.`}]}))}function fa({agentContext:e,log:n}){return Xe("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:_e.number().int().min(1).max(50).default(10).optional().describe("Maximum number of tasks to return (default 10)."),status:_e.enum(["all","active","completed"]).default("all").optional().describe("Filter by task status: all, active, or completed.")},async t=>{try{const n=await e.listTasks({limit:t.limit??10,status:t.status??"all"});return n.length?{content:[{type:"text",text:JSON.stringify(n,null,2)}]}:{content:[{type:"text",text:"No tasks found."}]}}catch(e){return n("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 xa({chatHistoryDb:e}){return Xe("read_conversation","Read recent messages from the main conversation between you and the user. Use this to review what was discussed recently.",{limit:_e.number().int().min(1).max(200).default(50).optional().describe("Number of recent messages to return (default 50)."),before:_e.number().int().optional().describe("Sequence number — return messages before this sequence for pagination.")},async n=>{if(!e)return{content:[{type:"text",text:"Chat history not available in this mode."}],isError:!0};const t=n.limit??50,a=null!=n.before?e.pageMessagesBefore(n.before,t):e.pageRecentMessages(t);if(0===a.data.length)return{content:[{type:"text",text:"No conversation messages found."}]};let s=ea(a.data);return a.hasMore&&(s+=`\n\nMore messages available. Use before=${Math.min(...a.data.map(e=>e.localSequence))} to load earlier messages.`),{content:[{type:"text",text:s}]}})}function va({agentContext:e,log:n}){return Xe("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:_e.string().describe('Brief reminder message (one sentence, e.g., "Heartbeat architecture discussion pending for 2 days, consider following up")'),filePath:_e.string().optional().describe("Path to detailed analysis file in workspace, if any")},async t=>{try{const n=e.getChatId();return await e.sendMessage({taskId:n,message:{type:"companion_reminder",content:t.content,filePath:t.filePath,timestamp:(new Date).toISOString()},target:"agent"}),{content:[{type:"text",text:"Reminder sent to main companion."}]}}catch(e){return n("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 ba({uploadFile:e,log:t}){return Xe("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., ).",{filePath:_e.string().describe("Absolute path to the local file to upload"),name:_e.string().optional().describe("Display name for the file (defaults to filename)")},async a=>{try{const t=n("path"),s=a.name||t.basename(a.filePath);return{content:[{type:"text",text:(await e({name:s,path:a.filePath,visibility:"public"})).url}]}}catch(e){return t("error","TOOL","File upload failed:",e),{content:[{type:"text",text:`File upload failed: ${e}`}],isError:!0}}})}function ya({agentContext:e,log:n}){return Xe("list_agents","List all available agents for the current user, including system agents and user-created agents (both published and draft).",{},async()=>{try{const{agents:n,draftAgents:t}=await e.listAgents(),a=e=>`- **${e.displayName||e.name}** (${e.id})\n Type: ${e.type}\n`+(e.developerName?` Developer: ${e.developerName}\n`:"")+` ${e.description||"No description"}\n`;let s="# Available Agents\n\n";return n.length>0&&(s+="## Published Agents\n\n",s+=n.map(a).join("\n")),t.length>0&&(s+="\n## Draft Agents\n\n",s+=t.map(a).join("\n")),0===n.length&&0===t.length&&(s+="No agents available."),{content:[{type:"text",text:s}]}}catch(e){return n("error","AGENTS","Failed to list agents:",e),{content:[{type:"text",text:`Failed to list agents: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}const wa=en(Ue);async function ka(e){try{const n=Ze(e);return await n.checkIsRepo()}catch{return!1}}async function Ia(e){const n=Ze(e);await n.add("."),await n.commit("Initial commit",{"--allow-empty":null})}async function Sa(e,n,t){const a=Ze(e);(await a.branchLocal()).all.includes(n)?await a.checkout(n):(t&&await a.checkout(t),await a.checkoutLocalBranch(n))}async function Ta(e){const n=Ze(e);return!(await n.status()).isClean()}async function Ca(e){const n=Ze(e),t=await n.log({maxCount:1});if(!t.latest)throw new Error("No commits found in repository");return t.latest.hash}async function Ea(e){try{const n=Ze(e);return null!==(await n.log({maxCount:1})).latest}catch{return!1}}function Aa(e){if(!oe(e))return!0;const n=de(e);return 0===n.length||1===n.length&&".git"===n[0]}function Ma(e){const n=e.match(/^(.*)?\{([^}]*) => ([^}]*)\}(.*)$/);if(!n)return e;const[,t="",,a,s=""]=n;return`${t}${a}${s}`}async function Pa(e,n,t){const a=Ze(e),s=await a.diffSummary([`${n}..${t}`]);return{totalInsertions:s.insertions,totalDeletions:s.deletions,files:s.files.map(e=>({path:Ma(I(e.file)),insertions:"insertions"in e?e.insertions:0,deletions:"deletions"in e?e.deletions:0}))}}async function Ra(e,n){try{const{stdout:t}=await wa("git",n,{cwd:e,maxBuffer:10485760});return t}catch(e){const n=e;if(1===n.code&&"string"==typeof n.stdout)return n.stdout;throw e}}function $a(e){return e.split("\n").map(e=>e.trim()).filter(Boolean).map(e=>function(e){const[n,t,a]=e.split("\t");if(!n||!t||!a)return null;const s="-"===n?0:Number.parseInt(n,10),i="-"===t?0:Number.parseInt(t,10);if(Number.isNaN(s)||Number.isNaN(i))return null;const o=a.startsWith("/dev/null => ")?a.slice(13):a;return{path:Ma(I(o)),insertions:s,deletions:i}}(e)).filter(e=>null!==e)}function _a(e,n){return _("sha256").update(`${e}\n${n}`).digest("hex")}async function Da(e,n){const t=await Ra(e,["diff","--binary","--find-renames",n,"--"]),a=$a(await Ra(e,["diff","--numstat","--find-renames",n,"--"])),s=await async function(e){const{stdout:n}=await wa("git",["ls-files","--others","--exclude-standard","-z"],{cwd:e,maxBuffer:10485760});return n.split("\0").filter(Boolean)}(e),i=await Promise.all(s.map(n=>Ra(e,["diff","--no-index","--binary","--","/dev/null",n]))),o=$a((await Promise.all(s.map(n=>Ra(e,["diff","--no-index","--numstat","--","/dev/null",n])))).join("\n")),r=function(e){const n=e.trim();return n?`${n}\n`:""}([t,...i].filter(Boolean).join("\n"));return r?{patch:r,stats:{totalInsertions:(c=[...a,...o]).reduce((e,n)=>e+n.insertions,0),totalDeletions:c.reduce((e,n)=>e+n.deletions,0),files:c},artifactVersion:_a(n,r)}:null;var c}async function Na(e){const n=Ze(e);return(await n.revparse(["--abbrev-ref","HEAD"])).trim()}async function Oa(e,n,t){const a=Ze(e);await a.remote(["set-url",n,t])}const ja="oauth2",qa="AGENTRIX_GIT_USERNAME",Ua="AGENTRIX_GIT_PASSWORD";function Ga(){const e=ve(Z(),`git-askpass-${$()}.sh`);return pe(e,`#!/bin/sh\ncase "$1" in\n *Username*|*username*) printf '%s\\n' "\${${qa}:-${ja}}" ;;\n *) printf '%s\\n' "\${${Ua}:-}" ;;\nesac\n`,{mode:448}),e}function La(e,n,t=ja){return{...process.env,GIT_ASKPASS:e,GIT_TERMINAL_PROMPT:"0",[qa]:t,[Ua]:n}}function Wa(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 Fa(e){return`agentrix/${e}`}async function Ha(e){if(!e)return null;const n=await N.getSecretKey();return n?On(e,n):null}async function Ba(e,n){const t=function(e){const n=function(e){return ve(Nn,`${e}.pat.meta.json`)}(e);if(!oe(n))return null;try{return JSON.parse(re(n,"utf8"))}catch{return null}}(n);if(!t)return void console.warn("[GIT] No PAT user metadata found, skipping git config");const a=t.username,s=t.email||`${t.username}@gitlab.local`;await async function(e,n,t){await wa("git",["config","user.name",n],{cwd:e}),await wa("git",["config","user.email",t],{cwd:e})}(e,a,s),console.log(`[GIT] Set local git config user.name=${a} user.email=${s}`)}async function za(e,n,t,a){const s=await Ha(a);s?await async function(e,n,t,a=!1){const s=Ga();try{const i=["-c","credential.helper=","push","origin",t];a&&i.push("--force"),await wa("git",i,{cwd:n,env:La(s,e)})}finally{he(s)}}(s,e,n,t):await async function(e,n,t=!1){const a=Ze(e),s=t?["--force"]:[];await a.push("origin",n,s)}(e,n,t)}async function Ka(e,n,t){await async function(e){const n=Ze(e);await n.init()}(e);const a=function(e,n){return{hook_event_name:"RepositoryInit",workspace_path:e,task_id:n}}(e,n);return t?.onRepositoryInit&&await t.onRepositoryInit(a),await Ia(e),await Ca(e)}async function Va(e,n,t){const a=t.trim();if(!a)return;const s=N.resolveDataDir(e,n),i=ve(s,"patch.diff");return await nn(s,{recursive:!0}),await tn(i,`${a}\n`),i}async function Xa(e,n,t){await N.writeLastSentArtifactVersion(e,n,t)}function Ja(e,n){return`Please generate pull request metadata for the changes made in this task.\n\nInitial commit hash: ${e}\n${n?`\n\nAdditional instructions:\n${n}`:""}\n\nProvide a concise title (conventional commits format), a detailed description, and a user-facing summary message.`}function Ya(e,n,t,a=6e4){return new Promise(s=>{const i=`shell_${sn().replace(/-/g,"")}`;t.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=Ee("/bin/bash",["-c",e],{cwd:n,env:process.env,shell:!1});let r=null,c=!1;a>0&&(r=setTimeout(()=>{c=!0,o.kill("SIGTERM"),setTimeout(()=>{o.killed||o.kill("SIGKILL")},1e3)},a));let p="";o.stdout?.on("data",e=>{p+=e.toString()}),o.stderr?.on("data",e=>{p+=e.toString()}),o.on("close",(e,n)=>{let o,l,d;if(r&&clearTimeout(r),c){o=124,d=!0;const e=`\n[Command timed out after ${a/1e3} seconds]`;l=p?`${p}${e}`:e.trim()}else o=null!==e?e:"SIGTERM"===n?143:1,d=0!==o,l=p||"(no output)";t.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:""}),t.onComplete(o),s(o)}),o.on("error",e=>{r&&clearTimeout(r);const n=`[Error] ${e.message||"Command execution failed"}`;t.onOutput({type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:i,content:n,is_error:!0}]},parent_tool_use_id:null,session_id:""}),t.onComplete(1),s(1)})})}class Qa{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 n=("string"==typeof e.message.content?e.message.content:"").trim();return n.startsWith("!")&&!n.startsWith("![")?{type:"bash-command",content:n.slice(1).trim(),originalMessage:e}:"![merge-request]"===n?{type:"merge-request",content:n,originalMessage:e}:"![merge-pr]"===n?{type:"merge-pr",content:n,originalMessage:e}:"![new]"===n?{type:"new-session",content:n,originalMessage:e}:"![plan]"===n?{type:"plan-mode",content:n,originalMessage:e}:{type:"normal",content:n,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 n=this.parseMessage(e),t={id:"msg-"+ ++this.messageIdCounter,type:n.type,priority:"normal",content:n.content,originalMessage:e,timestamp:Date.now()};this.messageQueue.push(t),this.log("info","COORDINATOR",`Enqueued message ${t.id} (type: ${t.type}, queue: ${this.messageQueue.length})`),this.tryUpdateWorkerState(),this.tryProcessNext()}async tryProcessNext(){if(!this.isStopped)if(0!==this.messageQueue.length)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.tryUpdateWorkerState(),this.isStopped||this.tryProcessNext()}else this.tryUpdateWorkerState()}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;case"plan-mode":await this.processPlanMode(e);break;default:this.log("warn","COORDINATOR",`Unknown message type: ${e.type}`)}}finally{if("normal"!==e.type){const n=e.originalMessage.__localSequence;void 0!==n&&this.config.onCommandMessageProcessed?.(n)}}}async processNormalMessage(e){this.log("info","COORDINATOR","Processing normal message for SDK");const n=await this.config.handlers.onNormalMessage(e.originalMessage);this.enqueueAgentMessage(n)}async processBashCommand(e){this.log("info","COORDINATOR",`Processing bash command: ${e.content}`),await this.processCommand(async()=>{await this.config.handlers.onBashCommand(e.content,e.originalMessage)})}async processMergeRequest(e){this.log("info","COORDINATOR","Processing merge-request command"),await this.processCommand(async()=>{await this.config.handlers.onMergeRequest(e.originalMessage)})}async processMergePr(e){this.log("info","COORDINATOR","Processing merge-pr command"),await this.processCommand(async()=>{await this.config.handlers.onMergePr()})}async processNewSession(e){this.log("info","COORDINATOR","Processing new-session command"),await this.processCommand(async()=>{await(this.config.handlers.onNewSession?.())})}async processPlanMode(e){this.log("info","COORDINATOR","Processing plan-mode command"),await this.processCommand(async()=>{if(!this.config.handlers.onPlanMode)return;const n=await this.config.handlers.onPlanMode(e.originalMessage);n&&this.enqueueAgentMessage(n)})}async processCommand(e){await this.waitWorkerIdle(),this.setCommandRunning(!0);try{await e()}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 n=this.workerState;if(this.log("info","COORDINATOR",`Worker state: ${n} → ${e}`),this.workerState=e,"running"===e&&"idle"===n&&(this.runStartTime=Date.now(),this.config.workClient.sendWorkRunning(this.getActiveAgents()),this.lastActiveAgentsSignature=this.getActiveAgentsSignature(),this.clearIdleTimer()),"idle"===e&&"running"===n){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,n,t){const a="running"===this.workerState,s=this.lastActiveAgentsSignature;t?this.agentRunningMap.set(e,{agentId:e,agentName:n,startedAt:Date.now()}):this.agentRunningMap.delete(e);const i=this.getActiveAgentsSignature();this.lastActiveAgentsSignature=i,this.tryUpdateWorkerState(),a&&"running"===this.workerState&&i!==s&&this.config.workClient.sendWorkRunning(this.getActiveAgents())}setBackgroundTaskRunning(e,n){e&&(n?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:n})=>({agentId:e,agentName:n}))}getActiveAgentsSignature(){const e=this.getActiveAgents().slice().sort((e,n)=>e.agentId.localeCompare(n.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,n=this.hasExecutionWork(),t=!e&&!n;this.setWorkerState(t?"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,n,t){this.config.logger&&this.config.logger(e,n,t)}}function Za(e,n){const t={type:"assistant",session_id:"",uuid:crypto.randomUUID(),parent_tool_use_id:null,message:{role:"assistant",content:[{type:"text",text:n}]}};e.sendTaskMessage(Bt,t)}async function es(e){const{workingDirectory:n,workClient:t,repositoryId:a,gitServerId:s,logger:i,askUser:o,commitChanges:r}=e;if(i.info("[MERGE-PR] Executing merge-pr command"),a){try{const e=await Na(n),a=await Ta(n),c=await async function(e,n){const t=Ze(e);try{return(await t.log([`origin/${n}..HEAD`])).total>0}catch{return!0}}(n,e);if(a||c){const p=await async function(e,n,t,a){let s="";s=e&&n?"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 t(i)).answers[0];return e.startsWith("other:")?(a.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 a.error("[MERGE-PR] Ask user failed:",e),"Pause"}}(a,c,o,i);if("Pause"===p)return void Za(t,"Operation paused. Please handle git state and run merge again.");if(("Push"===p||"PushAndMerge"===p)&&(a&&(i.info("[MERGE-PR] Generating commit message with agent"),await r(),i.info("[MERGE-PR] Committed changes with agent-generated message")),i.info(`[MERGE-PR] Pushing branch ${e} to remote`),await za(n,e,!1,s),"Push"===p))return void Za(t,"✅ All changes pushed to remote. You can now review and run merge again if everything looks good.")}const p=await t.sendMergePr();if(p.success)Za(t,`✅ PR merged successfully! Branch ${e} has been merged into the target branch.`);else{let e;switch(p.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: ${p.error||"Unknown error"}`;break;default:e=`Failed to merge PR: ${p.error||"Unknown error"}`}t.sendSystemErrorMessage(e)}}catch(e){i.error("[MERGE-PR] Failed:",e);const n=e instanceof Error?e.message:"Unknown error";t.sendSystemErrorMessage(`Failed to push or merge: ${n}`)}i.info("[MERGE-PR] Worker ready after merge-pr execution")}else t.sendSystemErrorMessage("Cannot merge: task has no git repository configured.")}function ns(e,n){const t=e.updates?.repositoryId;return"string"==typeof t&&0!==t.length&&n.repositoryId!==t&&(n.repositoryId=t,N.writeTaskInput(n),!0)}function ts(e,n,t,a={}){const s=t.sendAskUser(e),i=a.timeoutMs??18e5,o=a.onTimeout;return new Promise((e,a)=>{const r=setTimeout(()=>{n.delete(s);const i={type:"ask_user_response",answers:[],status:"timeout",reason:"timeout"};t.sendAskUserResponse(s,i),"abort_task"===o?(t.onTimeoutMessage?.("ask_user timed out. Task cancelled."),t.stopTask?.("ask_user_timeout"),a(new Error("Ask user request timed out"))):e(i)},i);n.set(s,n=>{clearTimeout(r),e(function(e){const n=e.status??"answered";return e.status&&e.reason?e:{...e,status:n,reason:e.reason??("timeout"===n?"timeout":"user")}}(n))})})}function as(e){const n=e.split("\n");for(;n.length>0&&""===n[0].trim();)n.shift();for(;n.length>0&&""===n[n.length-1].trim();)n.pop();const t=n.reduce((e,n)=>{if(""===n.trim())return e;const t=n.match(/^\s*/)[0].length;return Math.min(e,t)},1/0);return n.map(e=>e.slice(t)).join("\n")}const ss=as("\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"),is=as('\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'),os=as('\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'),rs=as('\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'),cs=as("\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"),ps=as(`\n ${rs}\n\n ${is}\n\n ${os}\n`),ls=as('\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 ds(e){const n=["# Available Agents",""];for(const t of e)t.description?n.push(`- **${t.name}** (${t.id}): ${t.description}`):n.push(`- **${t.name}** (${t.id})`);return n.join("\n")}function us(e,n){const t=n.find(n=>n.id===e);if(!t)return ds(n);const a=n.filter(n=>n.id!==e),s=["# Group Context","",`You are \`${t.name}\`. `,"You are a member of this group chat."];if(t.description&&s.push(`Your role: ${t.description}`),a.length>0){s.push(""),s.push("## Other Agents in This Group"),s.push("");for(const e of a)e.description?s.push(`- **${e.name}**: ${e.description}`):s.push(`- **${e.name}**`)}return s.push(""),s.push(ls),s.join("\n")}function ms(e){const n={};for(const[t,a]of Object.entries(e))"string"==typeof a&&(n[t]=a);return n}function gs(e){if("object"!=typeof e||null===e)return!1;const n=e;return"text"===n.type&&"string"==typeof n.text}function hs(e){return{type:"user",message:{role:"user",content:e},parent_tool_use_id:null,session_id:""}}function fs(e){const n=e.message?.content;return"string"==typeof n?n:Array.isArray(n)?n.filter(gs).map(e=>e.text).join("\n").trim():""}function xs(e){const n=e.usage.input_tokens-e.usage.cached_input_tokens,t={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:t,modelUsage:{[e.model]:{inputTokens:n>0?n: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 vs="agentrix",bs="1.0.0";async function*ys(e){yield e}let ws;const ks=["Bash","Glob","Grep","ExitPlanMode","Read","Skill","SlashCommand","EnterPlanMode"],Is=["Glob","Grep","Read","Skill"],Ss=["Read","Glob","Grep"],Ts=["Read","Glob","Grep","TodoWrite"];function Cs(e,n,t,a,s,i,o){const r=function(e){const{agentId:n,modeConfig:t,cwd:a,agentConfig:s}=e,{mode:i,groupAgents:o}=t,r=s.customSystemPrompt,c=s.systemPromptMode??"append",p=function(e){const{mode:n,supportChangeTitle:t}=e;switch(n){case"work":return t?ss:void 0;case"companion_shadow":case"companion_chat":case"reply":case"group_chat":return;case"chat":return cs;case"group_work":{const e=[];return t&&e.push(ss),e.join("\n\n")}}}(t);if("group_chat"===i||"group_work"===i){const e=[ps];return o&&o.length>0&&e.push(ds(o)),p&&e.push(p),e.join("\n\n")}const l="reply"===i&&o&&o.length>0?us(n,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?on(r,a,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}}({agentId:e,modeConfig:n.modeConfig,cwd:n.cwd,agentConfig:t}),c=function(e){switch(e){case"work":case"companion_shadow":return;case"chat":case"companion_chat":return[...ks];case"reply":return[...Is];case"group_chat":return[...Ss];case"group_work":return[...Ts]}}(n.modeConfig.mode),p=function(e,n){const t={},a=e=>async(n,t,a)=>await e(n,t,a)??{},s=new Set([...Object.keys(e),...n?Object.keys(n):[]]);for(const i of s){const s=[],o=e[i];o&&s.push(a(o));const r=n?.[i];r&&s.push(a(r)),t[i]=[{hooks:s}]}return t}(n.hooks??{},a),l=function(){if(void 0!==ws)return ws??void 0;const e=process.env.AGENTRIX_CLAUDE_PATH?.trim();if(e){const n=function(e){const n=e.trim();if(n){if(n.includes("/")||n.includes("\\")||n.startsWith(".")){const e=Se(n)?n:Te(n);return oe(e)?e:void 0}return function(e){const n="win32"===process.platform?"where":"which",t=je(n,[e],{encoding:"utf-8"});if(0===t.status)return t.stdout.split(/\r?\n/).map(e=>e.trim()).find(e=>e.length>0)}(n)}}(e);if(n)return ws=n,n}ws=null}(),d=i?function(e){const{modeConfig:n,tools:t,serverName:a=vs,serverVersion:s=bs}=e,{mode:i,supportChangeTitle:o}=n,r=[];switch(i){case"work":o&&r.push(t.changeTaskTitle),r.push(t.askUser),r.push(t.getTaskHistory);break;case"chat":r.push(t.createTask),r.push(t.replyToSubTask),r.push(t.askUser),r.push(t.getTaskHistory),r.push(t.listSubTask);break;case"group_chat":r.push(t.invoke),r.push(t.createSoloTask),r.push(t.createGroupTask),r.push(t.replyToSubTask),r.push(t.getTaskAgents),r.push(t.getTaskHistory);break;case"group_work":r.push(t.invoke),r.push(t.assign),o&&r.push(t.changeTaskTitle),r.push(t.getTaskAgents),r.push(t.getTaskHistory);break;case"reply":r.push(t.getTaskHistory),r.push(t.askUser);break;case"companion_chat":r.push(t.createTask),r.push(t.replyToSubTask),r.push(t.askUser),r.push(t.getTaskHistory),r.push(t.uploadFile),r.push(t.listAgents);break;case"companion_shadow":r.push(t.getTaskHistory),r.push(t.readConversation),r.push(t.listAgents)}("companion_chat"===i||"companion_shadow"===i)&&(r.push(t.listTasks),r.push(t.updateAgentInfo),r.push(t.sendReminder));const c=Je({name:a,version:s,tools:r}),p=r.map(e=>((e,n)=>`mcp__${e}__${n}`)(a,e.name));return{server:c,toolNames:p}}({modeConfig:n.modeConfig,tools:i}):void 0,u={...d?.server?{agentrix:d.server}:{},...n.mcpServers??{},...s??{}};return{stderr:n.stderr,model:t.customModel||n.model,fallbackModel:t.customFallbackModel,cwd:n.cwd,resume:n.agentSessionId,permissionMode:n.initialPermissionMode??t.customPermissionMode??"bypassPermissions",settingSources:["user","project","local"],systemPrompt:r,tools:c,mcpServers:u,plugins:t.customPlugins,abortController:n.abortController,env:n.env?ms(n.env):void 0,pathToClaudeCodeExecutable:l,maxTurns:t.customMaxTurns??n.maxTurns??o,extraArgs:t.customExtraArgs,canUseTool:n.canUseTool,hooks:p,outputFormat:n.structuredOutputSchema}}class Es{constructor(e,n,t,a){this.agentId=e,this.agentConfig=n,this.agentHooks=t,this.agentMcpServers=a}getAgentConfiguration(){return this.agentConfig}getHooks(){return this.agentHooks}getMcpServers(){return this.agentMcpServers}async executeHook(e,n,t){await async function(e,n,t,a){if(!e)return;const s=e[n];if(!s)return;const i=a||(e=>console.log(e));try{i(`[${n}] Executing hook...`);const e=new AbortController,a=setTimeout(()=>{e.abort()},6e4);try{await s(t,"",{signal:e.signal}),i(`[${n}] Hook executed successfully`)}finally{clearTimeout(a)}}catch(e){console.warn(`[${n}] Hook failed (non-fatal):`,e)}}(this.agentHooks,e,n,t)}async run(e,n){const t=this.agentConfig,a="string"==typeof e?hs(e):e;let s=null;const i=Ye({prompt:ys(a),options:Cs(this.agentId,n,t,this.agentHooks,this.agentMcpServers,n.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,n){const t=this.agentConfig,a="string"==typeof e?hs(e):e,s=Ye({prompt:ys(a),options:Cs(this.agentId,n,t,this.agentHooks,this.agentMcpServers,n.agentrixTools)});for await(const e of s)if(yield e,"result"===e.type)break}loop(e){const n=e.abortController,t=this.agentConfig,a=Cs(this.agentId,e,t,this.agentHooks,this.agentMcpServers,e.agentrixTools);let s=!1;const i=[];let o=null,r=null;const c=()=>{if(!s&&(s=!0,o)){const e=o;o=null,e(null)}},p=async function*(){for(;!s&&!n.signal.aborted;){if(i.length>0){yield i.shift();continue}const e=await new Promise(e=>{o=e});if(!e)break;yield e}},l=async function*(){try{const e=Ye({prompt:p(),options:a});r=e;for await(const n of e)yield n}finally{r=null,c()}}();return n.signal.addEventListener("abort",c,{once:!0}),{push:e=>{if(console.log("ClaudeRunner.loop.push:",JSON.stringify(e,null,2)),s)return;const n="string"==typeof e?hs(e):e;if(o){const e=o;return o=null,void e(n)}i.push(n)},events:l,setPermissionMode:async e=>{r&&await r.setPermissionMode(e)}}}}function As(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:$(),session_id:e.sessionId}}function Ms(e,n){const t=$();return n.set(e,t),t}function Ps(e,n){return n.get(e)||e}function Rs(e,n){return"thread.started"===e.type||"turn.started"===e.type||"turn.completed"===e.type||"turn.failed"===e.type?null:"item.started"===e.type?function(e,n){switch(e.type){case"command_execution":return function(e,n){return{type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:Ms(e.id,n),name:"Bash",input:{command:e.command}}]},parent_tool_use_id:null,session_id:""}}(e,n);case"file_change":return function(e,n){return{type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:Ms(e.id,n),name:"Edit",input:{changes:e.changes.map(e=>({kind:e.kind,path:e.path}))}}]},parent_tool_use_id:null,session_id:""}}(e,n);case"mcp_tool_call":return function(e,n){return{type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:Ms(e.id,n),server_name:e.server,name:e.tool,input:e.arguments}]},parent_tool_use_id:null,session_id:""}}(e,n);case"web_search":return function(e,n){return{type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:Ms(e.id,n),name:"web_search",input:{query:e.query}}]},parent_tool_use_id:null,session_id:""}}(e,n);default:return null}}(e.item,n):"item.completed"===e.type?function(e,n){switch(e.type){case"agent_message":return function(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:$().toString()}}(e);case"reasoning":default:return null;case"command_execution":return function(e,n){return{type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:Ps(e.id,n),content:"failed"===e.status?"Command execution failed":e.aggregated_output||""}]},parent_tool_use_id:null,session_id:""}}(e,n);case"file_change":return function(e,n){const t=n.get(e.id),a=t??Ms(e.id,n),s=!t;(e.changes||[]).map(e=>`${e.kind}: ${e.path}`);const i={type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:a,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:a,content:"failed"===e.status?"File changes failed":"File changes completed"}]},parent_tool_use_id:null,session_id:""};return s?[i,o]:o}(e,n);case"mcp_tool_call":return function(e,n){const t=Ps(e.id,n),a="failed"===e.status&&e.error;return{type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:t,is_error:a,content:a?e.error.message:e.result?.content||""}]},parent_tool_use_id:null,session_id:""}}(e,n);case"web_search":return function(e,n){return{type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:Ps(e.id,n),content:{type:"web_search_result",results:[]}}]},parent_tool_use_id:null,session_id:""}}(e,n);case"todo_list":return function(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:""}}(e);case"error":return function(e){return{type:"assistant",message:{role:"assistant",content:`❌ Error: ${e.message}`},parent_tool_use_id:null,session_id:""}}(e)}}(e.item,n):null}let $s;class _s{createCodex(e){const n={},t=function(){if(void 0!==$s)return $s??void 0;const e=process.env.AGENTRIX_CODEX_PATH?.trim();return e?($s=e,e):0===je("codex",["--version"],{stdio:"ignore"}).status?($s="codex",$s):void($s=null)}();return t&&(n.codexPathOverride=t),e.env&&(n.env=ms(e.env)),new pn(Object.keys(n).length>0?n:void 0)}getAgentConfiguration(){return null}getHooks(){}getMcpServers(){}async executeHook(e,n,t){}async run(e,n){const t=n.abortController,a=this.createCodex(n),s={workingDirectory:n.cwd,model:n.model,sandboxMode:"danger-full-access",approvalPolicy:"never",skipGitRepoCheck:!0},i=n.agentSessionId?a.resumeThread(n.agentSessionId,s):a.startThread(s),o=await i.run("string"==typeof e?e:fs(e),{signal:t.signal,outputSchema:n.structuredOutputSchema?.schema||void 0}),r=i.id??n.agentSessionId??"unknown",c=o.usage??{input_tokens:0,cached_input_tokens:0,output_tokens:0};return xs({sessionId:r,model:n.model??"unknown",numTurns:1,usage:c,result:o.finalResponse??""})}async*runStreamed(e,n){const t=n.abortController,a=this.createCodex(n),s={workingDirectory:n.cwd,model:n.model,sandboxMode:"danger-full-access",approvalPolicy:"never",skipGitRepoCheck:!0},i=n.agentSessionId?a.resumeThread(n.agentSessionId,s):a.startThread(s),{events:o}=await i.runStreamed("string"==typeof e?e:fs(e),{signal:t.signal,outputSchema:n.structuredOutputSchema?.schema||void 0});let r=n.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,n)=>{l.set(e,n)}};for await(const e of o){if("thread.started"===e.type&&(r=e.thread_id,yield As({sessionId:r,cwd:n.cwd,model:n.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 n=Rs(e,d);if(!n)continue;const t=Array.isArray(n)?n:[n];for(const e of t)yield e}}const u=xs({sessionId:r,model:n.model??"unknown",numTurns:1,usage:p,result:c});yield u}loop(e){const n=e.abortController,t=this.createCodex(e),a={workingDirectory:e.cwd,model:e.model,sandboxMode:"danger-full-access",approvalPolicy:"never",skipGitRepoCheck:!0};let s=e.agentSessionId?t.resumeThread(e.agentSessionId,a):t.startThread(a),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:fs(e),u=async function*(){try{for(;!i&&!n.signal.aborted;){const t=o.length>0?o.shift():await new Promise(e=>{r=e});if(!t)break;let a="";const l=new Map,u={get:e=>l.get(e),set:(e,n)=>{l.set(e,n)}},{events:m}=await s.runStreamed(d(t),{signal:n.signal,outputSchema:e.structuredOutputSchema?.schema||void 0});for await(const n of m){if(i)break;if("thread.started"!==n.type){if("turn.completed"===n.type){c&&(yield xs({sessionId:c,model:e.model??"unknown",numTurns:p+1,usage:n.usage??{input_tokens:0,cached_input_tokens:0,output_tokens:0},result:a}));break}if("turn.failed"===n.type)throw new Error(n.error.message);if("error"===n.type)throw new Error(n.message);if("item.started"===n.type||"item.completed"===n.type){"item.completed"===n.type&&"agent_message"===n.item.type&&n.item.text&&(a=n.item.text);const e=Rs(n,u);if(!e)continue;const t=Array.isArray(e)?e:[e];for(const e of t)yield e}}else c=n.thread_id,yield As({sessionId:c,cwd:e.cwd,model:e.model})}p+=1}}finally{l()}}();return n.signal.addEventListener("abort",l,{once:!0}),{push:e=>{if(console.log("CodexRunner.loop.push:",JSON.stringify(e,null,2)),!i){if(r){const n=r;return r=null,void n(e)}o.push(e)}},events:u}}}function Ds(e,n,t){e&&e(n,"AGENT",t)}const Ns=["PreToolUse","PostToolUse","SessionStart","SessionEnd","UserPromptSubmit","Stop","SubagentStop","PreCompact","Notification","RepositoryInit"];function Os(e){const n={};for(const t of Ns){const a=e[t];"function"==typeof a&&(n[t]=a,console.log(`[Hook Loader] ✓ Loaded hook: ${t}`))}const t=Object.keys(n).length;return 0===t?console.warn("[Hook Loader] No valid hooks found in module"):console.log(`[Hook Loader] Successfully loaded ${t} hook(s)`),n}class js{static pool=new Map;static async create(e,n,t){const a=this.pool.get(n);if(a)return a;let s;if("claude"===e){const e=await async function(e){const{agentId:n,agentDir:t,logger:a}=e;if(!n||"default"===n)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};try{Ds(a,"info",`Loading agent: ${n}`);const e=await rn({agentId:n,framework:"claude",agentDir:t});if(!e.claude)return Ds(a,"warn",`No claude configuration found for agent ${n}`),{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};const s=e.claude,i=s.plugins.map(e=>({type:"local",path:e})),o=t||cn().resolveAgentDir(n),r=s.config.sdkMcpTools?.map(e=>ve(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 Ds(a,"info",`Agent ${n} loaded successfully (${i.length} plugins)`),c}catch{return Ds(a,"error",`Failed to load agent: ${n}`),{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}}}({agentId:n,agentDir:t?.agentDir,logger:t?.logger});let a,i;t?.context&&n&&"default"!==n&&(a=await async function(e,n,t){if(e&&"default"!==e)try{const a=S(),s=n||a.resolveAgentDir(e),i=ve(s,"claude");return await async function(e,n){const t=J(e,"hooks");if(!z(t))return{};const a=[J(t,"dist","index.mjs"),J(t,"dist","index.js"),J(t,"index.mjs"),J(t,"index.js")];let s=null;for(const e of a)if(z(e)){s=e;break}if(!s)return console.warn(`[Hook Loader] Hooks not built: ${t}`),console.warn("[Hook Loader] To build hooks, run:"),console.warn(`[Hook Loader] cd ${t}`),console.warn("[Hook Loader] npm install && npm run build"),console.warn("[Hook Loader] Or place hooks directly in:"),console.warn(`[Hook Loader] ${J(t,"index.js")} or ${J(t,"index.mjs")}`),{};try{console.log(`[Hook Loader] Loading hooks: ${s}`);const e=`${He(s).href}?t=${Date.now()}`,t=await import(e);if("function"==typeof t.default){if(n)return console.log("[Hook Loader] Using factory pattern with AgentrixContext"),Os(t.default(n));console.warn("[Hook Loader] Factory function found but no context provided, skipping factory")}return Os(t)}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)}`)}}(i,t)}catch(e){return void console.warn("[AgentRunners] Failed to load hooks:",e)}}(n,t.agentDir,t.context)),t?.context&&e.customSdkMcpTools&&e.customSdkMcpTools.length>0&&(i=await async function(e,n,t){const a={};for(const s of e)try{t&&t("info","MCP",`Loading SDK MCP tools from: ${s}`);const e=await import(s),i=e.default||e;if(!i){t&&t("warn","MCP",`No default export found in ${s}`);continue}const o="function"==typeof i?i(n):i,r=o.name;a[r]=o,t&&t("info","MCP",`Loaded MCP server: ${r}`)}catch(e){t&&t("error","MCP",`Failed to load SDK MCP tools from ${s}: ${e instanceof Error?e.message:String(e)}`)}return a}(e.customSdkMcpTools,t.context,t.logger)),s=new Es(n,e,a,i)}else s=new _s;return this.pool.set(n,s),s}static release(e){this.pool.delete(e)}static releaseAll(){this.pool.clear()}}class qs{constructor(e){this.workingDirectory=e}async listFiles(e=3){const n=[];return this.listFilesRecursively(this.workingDirectory,n,"",e,0),n}async readFile(e){try{const n=V.join(this.workingDirectory,e);return F.existsSync(n)?F.readFileSync(n,"utf-8"):null}catch{return null}}async fileExists(e){const n=V.join(this.workingDirectory,e);return F.existsSync(n)}listFilesRecursively(e,n,t,a,s){if(!(s>a))try{const i=F.readdirSync(e,{withFileTypes:!0});for(const o of i){const i=t?`${t}/${o.name}`:o.name;o.isDirectory()?C.includes(o.name)||this.listFilesRecursively(V.join(e,o.name),n,i,a,s+1):o.isFile()&&n.push(i)}}catch(e){}}}class Us{constructor(e){this.params=e}state=null;async setup(){const{options:e,handlers:n}=this.params,{userId:t,taskId:a,cwd:s}=e;if(!s)throw new Error("[WORKSPACE] Missing cwd for workspace setup");const i=N.getWorkspaceState(t,a),o=e.repositorySourceType,r={...e,repositorySourceType:o},{initialCommitHash:c,isGitRepository:p,initPolicyUpdates:l}=await this.ensureWorkspace(r,n,i);await N.writeWorkspaceState(t,a,{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,initPolicies:{...i?.initPolicies,...l}});const d=await async function(e,n,t,a){return async function(e,n,t,a){if(!await ka(e))return{currentCommitHash:"",hadUncommittedChanges:!1,hasNewArtifacts:!1,lastSentArtifactVersion:void 0,patchPath:"",diffStats:void 0};const s=await Ta(e),i=await Ca(e),o=a||N.getWorkspaceState(n,t)?.initialCommitHash;if(!o)throw new Error(`Initial commit hash not found for task ${t}`);const r=await Da(e,o),c=r?await Va(n,t,r.patch):void 0,p=await N.readLastSentArtifactVersion(n,t),l=!!r&&r.artifactVersion!==p;return{currentCommitHash:i,currentArtifactVersion:r?.artifactVersion,hadUncommittedChanges:s,hasNewArtifacts:l,lastSentArtifactVersion:p??void 0,patchPath:c,diffStats:r?.stats}}(e,n,t,a)}(s,t,a,c);return this.state={cwd:s,initialCommitHash:c,isGitRepository:p,gitStateResult:d},p&&!e.taskRepositoryId&&await async function(e,n){try{const t=await async function(e){try{const n=Ze(e),t=(await n.getRemotes(!0)).find(e=>"origin"===e.name);if(!t?.refs?.fetch)return null;const a=t.refs.fetch,s=a.match(/^git@([^:]+):(.+)\/(.+?)(?:\.git)?$/);if(s){const[,e,n,t]=s;return{url:a,host:e.split("-")[0],owner:n,repo:t}}const i=a.match(/^https?:\/\/([^/]+)\/(.+)\/(.+?)(?:\.git)?$/);if(i){const[,e,n,t]=i;return{url:a,host:e,owner:n,repo:t}}return null}catch(e){return console.error("[GIT] Failed to get remote info:",e),null}}(e);if(!t)return void console.log("[REPO] No origin remote found, skipping repository association");if(!n?.onRepositoryDetected)return;console.log(`[REPO] Detected remote: ${t.host}/${t.owner}/${t.repo}`),n.onRepositoryDetected(t)}catch(e){console.error("[REPO] Failed to send repository association:",e)}}(s,n),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:n,initialCommitHash:t,isGitRepository:a}=this.getState(),{userId:s,taskId:i}=this.params.options;if(!a||!t)return{};const o=await Da(n,t);if(!o)return{};try{await Va(s,i,o.patch)}catch(n){e.onPatchError?.(n)}const r=await async function(e){const n=new qs(e);return T(n)}(n),c=await N.readLastSentArtifactVersion(s,i);return c&&c===o.artifactVersion?{artifactVersion:o.artifactVersion}:{artifactVersion:o.artifactVersion,artifacts:{artifactVersion:o.artifactVersion,stats:o.stats,preview:r}}}async ensureWorkspace(e,n,t){const a=e.repositorySourceType;return"git-server"===a?this.ensureGitServerWorkspace(e,n,t):"directory"===a?this.ensureDirectoryWorkspace(e,n,t):this.ensureTemporaryWorkspace(e,n,t)}async ensureGitServerWorkspace(e,n,t){const{cwd:a,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 ka(a),p=Aa(a);if(!c){if(!p)throw new Error(`[WORKSPACE] Directory ${a} exists but is not a git repository.`);const e=await async function(e,n,t,a,s){const i=Fa(t),o=await ka(e);if(!Aa(e)&&!o)throw new Error(`Directory ${e} exists but is not a git repository`);const r=await Ha(s);return Aa(e)?(r?(console.log("[GIT] Using GIT_ASKPASS credential injection for clone"),await async function(e,n,t){const a=be(t);oe(a)||le(a,{recursive:!0});const s=Ga();try{await wa("git",["-c","credential.helper=","clone",n,t],{env:La(s,e)})}finally{he(s)}}(r,n,e),s&&await Ba(e,s)):await async function(e,n){const t=be(n);oe(t)||le(t,{recursive:!0});const a=Ze();await a.clone(e,n)}(n,e),await Sa(e,i,a),await Ca(e)):(await Oa(e,"origin",n),r&&(console.log("[GIT] Using GIT_ASKPASS credential injection for fetch"),await async function(e,n){const t=Ga();try{await wa("git",["-c","credential.helper=","fetch","origin"],{cwd:n,env:La(t,e)})}finally{he(t)}}(r,e),s&&await Ba(e,s)),await Sa(e,i,a),await Ca(e))}(a,s,i,o,r)||await Ca(a);return{initialCommitHash:this.resolveInitialCommitHash(t?.initialCommitHash,e,"none"),isGitRepository:!0,autoCommitPolicy:"enabled"}}return await Oa(a,"origin",s),this.tryResolveDirtyRepo(e,n,t)}async ensureDirectoryWorkspace(e,n,t){const{cwd:a,taskId:s,userCwd:i}=e;if(await ka(a))return this.tryResolveDirtyRepo(e,n,t);if(!Aa(a))return{initialCommitHash:"",isGitRepository:!1,autoCommitPolicy:"enabled"};{if(!i)return{initialCommitHash:"",isGitRepository:!1,autoCommitPolicy:"enabled"};const e=i.replace(/^~/,ee());if(Aa(e))return{initialCommitHash:"",isGitRepository:!1,autoCommitPolicy:"enabled"};if(!await ka(e))return{initialCommitHash:"",isGitRepository:!1,autoCommitPolicy:"enabled"};await Ea(e)||await Ia(e),await async function(e,n,t){const a=e.replace(/^~/,ee());if(!await ka(a))throw new Error(`Directory ${a} is not a git repository. Worktrees can only be created from existing git repositories.`);if(!await Ea(a))throw new Error(`Cannot create worktree: repository at ${a} has no commits. Please create an initial commit first: cd ${a} && git add . && git commit -m 'Initial commit'`);const s=Fa(t),i=(await async function(e){const n=Ze(e),t=(await n.raw(["worktree","list","--porcelain"])).trim().split("\n").filter(Boolean),a=[];let s=null;for(const e of t)if(e.startsWith("worktree "))s&&a.push(s),s={path:e.replace("worktree ","").trim(),branch:null,commit:"",isMain:0===a.length};else if(s)if(e.startsWith("HEAD "))s.commit=e.replace("HEAD ","").trim();else{if(e.startsWith("branch ")){const n=e.replace("branch ","").trim();s.branch=n.replace("refs/heads/","");continue}e.startsWith("detached")&&(s.branch=null)}return s&&a.push(s),a}(a)).find(e=>e.path===n);if(i){if(i.branch&&i.branch!==s)throw new Error(`Worktree at ${n} is already attached to branch ${i.branch}. Remove it before retrying: git worktree remove ${n}`);return{initialCommitHash:await Ca(n)}}const o=Ze(a),r=(await o.branchLocal()).all.includes(s);if(oe(n)&&!Aa(n))throw new Error(`Worktree directory already exists at ${n}. This may be from a previous task. To clean up: git worktree remove ${n} OR rm -rf ${n}`);try{r?await o.raw(["worktree","add",n,s]):await async function(e,n,t,a="HEAD"){const s=be(n);if(oe(s)||le(s,{recursive:!0}),oe(n)&&!Aa(n))throw new Error(`Worktree directory already exists at ${n}`);const i=Ze(e);await i.raw(["worktree","add","-b",t,n,a])}(a,n,s,"HEAD")}catch(e){try{await async function(e,n,t=!1){const a=Ze(e),s=["worktree","remove"];t&&s.push("--force"),s.push(n),await a.raw(s)}(a,n,!0)}catch{}throw e}return{initialCommitHash:await Ca(n)}}(e,a,s)}return this.tryResolveDirtyRepo(e,n,t)}async ensureTemporaryWorkspace(e,n,t){const{cwd:a,taskId:s}=e;if(!await ka(a)){await async function(e,n,t){return{initialCommitHash:await Ka(e,n,t)}}(a,s,n),await Sa(a,`agentrix/${s}`,e.baseBranch);const i=await Ca(a);return{initialCommitHash:this.resolveInitialCommitHash(t?.initialCommitHash,i,"none"),isGitRepository:!0,autoCommitPolicy:"enabled"}}return this.tryResolveDirtyRepo(e,n,t)}async tryResolveDirtyRepo(e,n,t){let a=null,s="enabled";const i={};if(await async function(e){return!!await ka(e)&&await Ta(e)}(e.cwd)){const o=this.getPersistedInitPolicy(t,"uncommittedChanges",["Ignore","Commit","Stash"]),r=o?{action:o,remember:!0}:n?.onUncommittedChanges?await n.onUncommittedChanges():{action:"Ignore",remember:!1},c=r.action;if(await async function(e,n){switch(n){case"Ignore":console.log("[GIT] User chose to ignore uncommitted changes");break;case"Stash":console.log("[GIT] Stashing uncommitted changes"),await async function(e){const n=Ze(e);await n.stash(["push"])}(e);break;case"Commit":console.log("[GIT] Committing uncommitted changes with agent-generated message");break;case"Abort":throw new Error("Task aborted by user due to uncommitted changes")}}(e.cwd,c),"Abort"===c)throw new Error("Task aborted by user due to uncommitted changes");if("Commit"===c){if(!n?.onCommitUncommittedChanges)throw new Error("Unable to commit uncommitted changes during workspace setup");await n.onCommitUncommittedChanges()}!o&&r.remember&&(i.uncommittedChanges=c),a=c,"Ignore"===c&&(s="disabled_by_ignore")}let o;if(await Ea(e.cwd)||await Ia(e.cwd),"Ignore"===a){const n=`agentrix/${e.taskId}`;o=await Na(e.cwd)===n?"none":"kept"}else o=await this.tryResolveBranchMismatch(e,n,t,i);const r=await Ca(e.cwd);return{initialCommitHash:this.resolveInitialCommitHash(t?.initialCommitHash,r,o),isGitRepository:!0,autoCommitPolicy:s,initPolicyUpdates:i}}getPersistedInitPolicy(e,n,t){const a=e?.initPolicies?.[n];return a&&t.includes(a)?a:null}resolveInitialCommitHash(e,n,t){return e?"kept"===t?n:e:n}async tryResolveBranchMismatch(e,n,t,a){const s=`agentrix/${e.taskId}`,i=await Na(e.cwd);if(i===s)return"none";const o=this.getPersistedInitPolicy(t,"branchMismatch",["Switch","Keep"]),r=o?{action:o,remember:!0}:n?.onBranchMismatch?await n.onBranchMismatch({currentBranch:i,expectedBranch:s,workingDirectory:e.cwd}):{action:"Switch",remember:!1};if("Abort"===r.action)throw new Error("Task aborted by user due to branch mismatch");return!o&&r.remember&&(a.branchMismatch=r.action),"Keep"===r.action?"kept":(await Sa(e.cwd,s,e.baseBranch),"switched")}}const Gs=_e.object({title:_e.string().describe("Concise PR title following conventional commits format (feat/fix/docs/refactor/test/chore: description), maximum 50 characters"),description:_e.string().describe("Detailed PR description explaining: what changed, why these changes were necessary, any important technical decisions, and impact on existing functionality"),userMessage:_e.string().describe("Friendly message to display to the user, summarizing the PR creation. Should be concise and informative.")}),Ls=De(Gs,{target:"draft-07"}),Ws=De(Gs);function Fs(e){if("success"!==e.subtype)throw new Error("PR response failed before structured output was returned");const n=e;return n.structured_output?Gs.parse(n.structured_output):function(e){if(!e.trim())throw new Error("PR response was empty");const n=Hs(e),t=JSON.parse(n);return Gs.parse(t)}(n.result??"")}function Hs(e){const n=e.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);return n?n[1].trim():e.trim()}class Bs{chain=Promise.resolve();run(e){const n=this.chain.then(e,e);return this.chain=n.then(()=>{},()=>{}),n}}const zs=[{name:"/merge-request",sendAs:"![merge-request]",description:"Create a pull request for current task changes"},{name:"/merge-pr",sendAs:"![merge-pr]",description:"Merge the current pull request"},{name:"/new",sendAs:"![new]",description:"Start a new session for this task"}];function Ks(e){const n=e.trim();return n?n.startsWith("/")?n:`/${n}`:""}function Vs(e=[]){const n=[],t=new Set;for(const e of zs.map(e=>({id:`cli_builtin:${e.name}`,name:e.name,kind:"cli_builtin",sendAs:e.sendAs,description:e.description})))n.push(e),t.add(e.name);const a=Array.from(new Set(e.map(Ks).filter(Boolean)));a.sort((e,n)=>e.localeCompare(n));for(const e of a)t.has(e)||n.push({id:`sdk:${e}`,name:e,kind:"sdk",sendAs:e});return n}const Xs=_e.object({message:_e.string().describe("A git commit message following conventional commits. Return only the commit message text, optionally with a blank line and body.")}),Js=De(Xs,{target:"draft-07"}),Ys=De(Xs);async function Qs(e){if(!await Ta(e.workingDirectory))throw new Error("No uncommitted changes to commit");const n=await Ca(e.workingDirectory),t=await async function(e){const n=e.runner.runStreamed("Generate a git commit message for the current uncommitted changes.\n\nRequirements:\n- Follow this repository's commit message conventions.\n- Keep the subject line specific and concise.\n- Add a body only if it materially improves clarity.\n- Return only the commit message.",{cwd:e.workingDirectory,model:e.model,abortController:e.abortController,modeConfig:e.modeConfig,structuredOutputSchema:{type:"json_schema",schema:"claude"===e.schemaTarget?Js:Ys}});let t=null;for await(const a of n){if("result"===a.type){t=a;break}await(e.onStreamMessage?.(a))}if(!t)throw new Error("Commit message generation did not return a result message");return function(e){if("success"!==e.subtype)throw new Error("Commit message generation failed before structured output was returned");const n=e,t=(n.structured_output?Xs.parse(n.structured_output):Xs.parse(JSON.parse(Hs(n.result??"")))).message.trim();if(!t)throw new Error("Commit message generation returned an empty message");return t}(t)}(e),a=await async function(e,n){const t=n.trim();if(!t)throw new Error("Commit message cannot be empty");const[a,...s]=t.split(/\n\s*\n/).map(e=>e.trim()).filter(Boolean);if(!a)throw new Error("Commit subject cannot be empty");const i=Ze(e);await i.add(["--all"]);const o=["commit","-m",a];for(const e of s)o.push("-m",e);return await i.raw(o),await Ca(e)}(e.workingDirectory,t);if(await Ta(e.workingDirectory))throw new Error("Commit completed but working tree is still dirty");if(a===n)throw new Error("Commit completed but HEAD did not change");return{commitHash:a,message:t}}async function Zs(e,n){await ie.promises.mkdir(n,{recursive:!0});const t=await ie.promises.readdir(e,{withFileTypes:!0});for(const a of t){const t=xe.join(e,a.name),s=xe.join(n,a.name);a.isDirectory()?await Zs(t,s):await ie.promises.copyFile(t,s)}}class ei{constructor(e,n,t){this.credentials=e,this.options=n,this.workingDirectory=t;const a=this.options.input,{taskId:s,userId:i}=a;this.logger=U({type:"worker",taskId:s}),this.currentAgentSessionId="agentSessionId"in a?a.agentSessionId:void 0;const o=a.taskAgents||[];this.taskAgentsMap=new Map(o.map(e=>[e.id,e]));const r=this.taskAgentsMap.size>1;this.primaryAgentId=r?"planner":a.agentId,this.primaryAgentName=r?"planner":this.taskAgentsMap.get(a.agentId)?.name??"unknown";const c=this.createWorkerClientConfig(i,s,t),p=N.resolveDataDir(i,s);this.historyDb=Ot({dataDir:p,taskId:s}),this.workClient=new zt(c.config,{...c.handlers,getPermissionMode:()=>this.getPermissionModeSnapshot(),historyDb:this.historyDb}),this.coordinator=this.createMessageCoordinator(this.workClient,this.options.idleTimeoutSecond),this.agentContext=new Kt({logger:this.logger,socketClient:this.workClient.client,taskId:a.taskId,userId:a.userId,chatId:a.chatId,rootTaskId:a.rootTaskId||a.taskId,parentTaskId:a.parentTaskId||null,workingDirectory:this.workingDirectory,taskAgents:a.taskAgents||[],serverUrl:N.serverUrl,taskDataKey:this.options.dataEncryptionKey}),this.agentrixTools=this.createAgentrixTools();const l={...Wa(this.options.input),cwd:this.workingDirectory};this.workspace=new Us({options:l,handlers:this.createWorkspaceHandlers(this.workClient)})}abortController=new AbortController;isStopping=!1;askUserAwaiter=new Map;messageFilter=Jt();logger;workClient;workspace;coordinator;agentContext;runner;agentQueues=new Map;currentAgentSessionId;currentGroupId=null;historyDb;chatHistoryDb=null;agentrixTools;pendingNavigateTaskId=null;pendingPermissions=new Map;grantedPermissions=new Set;loopPermissionModeSetter=null;configuredPermissionMode="bypassPermissions";desiredPermissionMode=null;activePermissionMode=null;lastBroadcastPermissionMode=null;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()}getConfiguredPermissionMode(){const e=this.runner?.getAgentConfiguration()?.customPermissionMode;return e??"bypassPermissions"}initializePermissionModeState(){this.configuredPermissionMode=this.getConfiguredPermissionMode(),this.desiredPermissionMode??=this.configuredPermissionMode}getPermissionModeSnapshot(){return this.desiredPermissionMode??this.configuredPermissionMode??null}broadcastPermissionMode(e){this.lastBroadcastPermissionMode!==e&&(this.lastBroadcastPermissionMode=e,this.workClient.sendPermissionMode(e))}confirmPermissionModeApplied(e){this.desiredPermissionMode=e,this.activePermissionMode=e,this.broadcastPermissionMode(e)}async applyPermissionMode(e){this.loopPermissionModeSetter&&(await this.loopPermissionModeSetter(e),this.confirmPermissionModeApplied(e))}async flushDesiredPermissionMode(){const e=this.getPermissionModeSnapshot();e&&this.loopPermissionModeSetter&&this.activePermissionMode!==e&&await this.applyPermissionMode(e)}async requestPermissionMode(e){this.desiredPermissionMode=e,this.broadcastPermissionMode(e),await this.flushDesiredPermissionMode()}async restoreConfiguredPermissionMode(){await this.requestPermissionMode(this.configuredPermissionMode)}shouldProcessMessage(e){const n=e.message,t=this.getRunnerMode(),a="group_chat"===t||"group_work"===t,s=w(n);return!!E(n)||!!A(n)||!(!k(n)&&!s)&&"agent"!==e.senderType&&(a?e.senderId!==this.primaryAgentId:!!s||"system"===e.senderType&&"user"===n.type||"user"===n.type)}shouldDropHeartbeatWhileBusy(){return this.coordinator.isActivelyExecuting()}async processPendingMessages(){const e=this.historyDb.pageMessagesAfter(this.lastProcessedSequence,100),n=this.getRunnerMode(),t="group_chat"===n||"group_work"===n,a=[];for(const n of e.data)if(this.lastProcessedSequence=n.localSequence,this.shouldProcessMessage(n)){if(t&&this.isUnsupportedGroupPlanCommand(n)){this.log("info","PLAN","Ignoring unsupported ![plan] command in group mode");continue}a.push(n)}if(a.length>0){this.deduplicateHeartbeats(a);const e=this.mergeConsecutiveHumanMessages(a);t?await this.processMessagesAsGroup(e):await this.processMessagesIndividually(e)}e.hasMore&&await this.processPendingMessages()}isUnsupportedGroupPlanCommand(e){const n=e.message;return!(!k(n)||"user"!==n.type)&&"![plan]"===fs(n).trim()}deduplicateHeartbeats(e){let n=-1;for(let t=e.length-1;t>=0;t--)E(e[t].message)&&(-1===n?n=t:(e.splice(t,1),n--))}mergeConsecutiveHumanMessages(e){if(0===e.length)return[];const n=[];let t=0;for(;t<e.length;){const a=e[t];if("human"===a.senderType){const s=[a];for(;t+1<e.length;){const n=e[t+1];if("human"!==n.senderType||n.senderId!==a.senderId)break;s.push(n),t++}1===s.length?n.push(a):n.push(this.createMergedHumanMessage(s))}else n.push(a);t++}return n}createMergedHumanMessage(e){const n=[],t=[];for(const a of e){const e=a.message;if(!k(e)||"user"!==e.type)continue;const s=e.message.content;if("string"==typeof s)n.push(s);else if(Array.isArray(s))for(const e of s)"text"===e.type?n.push(e.text):t.push(e)}const a=n.join(""),s=t.length>0?[{type:"text",text:a},...t]:a,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 n=[],t=[];for(const a of e){const e=Yt(a);if(e){const a=e.message.content;if("string"==typeof a)n.push(a);else if(Array.isArray(a))for(const e of a)"text"===e.type?n.push(e.text):t.push(e)}}if(0===n.length)return;const a=Math.max(...e.map(e=>e.localSequence)),s=n.join(" "),i={type:"user",message:{role:"user",content:t.length>0?[{type:"text",text:s},...t]:s},parent_tool_use_id:null,session_id:""};i.__localSequence=a,await this.coordinator.enqueue(i)}async processMessagesIndividually(e){for(const n of e){const e=this.formatSingleMessage(n);e&&(e.__localSequence=n.localSequence,await this.coordinator.enqueue(e))}}formatSingleMessage(e){const n=e.message;if(E(n))return{type:"user",message:{role:"user",content:`[heartbeat] You are being awakened by a scheduled heartbeat at ${n.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(A(n)){const e=n;let t=`[reminder from shadow] ${e.content}`;return e.filePath&&(t+=`\nDetailed analysis: ${e.filePath}`),{type:"user",message:{role:"user",content:t},parent_tool_use_id:null,session_id:""}}return k(n)&&"user"===n.type?n: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(n){if(!(n instanceof Qe)){e="error",this.log("warn","AGENT","Fatal error:",n);const t=n instanceof Error?n.message:String(n);await this.reportFatalError(t)}}finally{await this.exitWorker(e)}}async autoInstallAgent(e){const n=this.options.input,t=n.agentGitUrl,a=n.agentGitSubDir;if(t)try{this.log("info","AGENT",`Auto-installing agent ${e} from git`),await Pt({agentId:e,gitUrl:t,subDir:a??void 0})}catch(n){this.log("warn","AGENT",`Auto-install failed for agent ${e}: ${n}`)}else this.log("warn","AGENT",`Auto-install skipped: no agentGitUrl provided for agent ${e}`)}async applyAgentUpgrade(e,n,t){const a=N.agentrixAgentsHomeDir,s=ve(a,`${e}.new`),i=ve(a,`${e}-bak`);try{this.log("info","AGENT",`Applying upgrade for ${e}`),Rt(t),ue(t,s),await Zs(n,i),me(n,{recursive:!0,force:!0}),ue(s,n),z(i)&&me(i,{recursive:!0,force:!0}),this.log("info","AGENT",`Upgrade applied for ${e}`)}catch(t){this.log("warn","AGENT",`Upgrade failed for ${e}: ${t}`),!z(n)&&z(i)&&ue(i,n),z(s)&&me(s,{recursive:!0,force:!0})}}async initialize(){const e=this.options.input,n=N.resolveAgentDir(e.agentId),t=ve(n,"upgrade"),a=Boolean(e.agentId&&"default"!==e.agentId&&!e.agentDir&&!z(n)),s=Boolean(e.agentId&&"default"!==e.agentId&&!e.agentDir&&!a&&z(t));await this.workClient.connect(),this.workClient.sendWorkerInitializing({deployingAgent:a,upgradingAgent:s}),a&&await this.autoInstallAgent(e.agentId),s&&await this.applyAgentUpgrade(e.agentId,n,t);const i=await js.create("claude",e.agentId,{agentDir:e.agentDir,logger:this.log.bind(this),context:this.agentContext});this.runner=i,this.initializePermissionModeState(),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(),this.workClient.sendTaskSlashCommandsUpdate(Vs())}createWorkspaceHandlers(e){return{onRepositoryDetected:n=>{e.associateRepository(n.host,n.owner,n.repo,n.url)},onRepositoryInit:async e=>{await(this.runner?.executeHook("RepositoryInit",e))},onUncommittedChanges:this.onUncommittedChanges.bind(this),onCommitUncommittedChanges:this.commitCurrentChangesWithAgent.bind(this),onBranchMismatch:this.onBranchMismatch.bind(this)}}async registerWithDaemon(e){const n=this.options.input.taskId,t=await un(n,{cwd:e,machineId:this.credentials.machineId,pid:process.pid,startedBy:this.options.startedBy||"terminal"});t.error?this.log("warn","DAEMON",`Failed to report session ${n}:`,t.error):this.log("info","DAEMON",`Session ${n} registered`)}setEnvironmentVariables(){this.options.input.environmentVariables&&Object.entries(this.options.input.environmentVariables).forEach(([e,n])=>{null!=n&&(process.env[e]=String(n))}),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,n){const t=1e3*Math.max(0,n??0);return this.coordinator=new Qa({workerType:"claude",workClient:e,onCommandMessageProcessed:e=>{this.markPrimaryMessageProcessed(e)},handlers:{onNormalMessage:async e=>e,onBashCommand:async(e,n)=>{await this.executeBashCommand(e)},onMergeRequest:async e=>{await this.executeMergeRequest()},onMergePr:async()=>{await this.executeMergePr()},onNewSession:async()=>{await this.executeNewSession()},onPlanMode:async()=>(await this.requestPermissionMode("plan"),null)},logger:(e,n,t)=>{const a=e;this.log(a,n,t)},idleTimeoutMs:t,onIdleTimeout:()=>this.stopTask("idle")}),this.coordinator}handleEvent(){const e=this.options.input.event,n=this.options.input.eventData;if("sub-task-result-updated"===e){const e=n,t=Xt(e,this.options.dataEncryptionKey);this.historyDb.saveMessage({eventId:e.eventId||`sub-task-${Date.now()}`,message:t,senderType:"system",senderId:"system",senderName:"system"})}this.triggerMessageProcessing()}async executeMergeRequest(){this.log("info","MERGE","Executing merge-request command");const e=this.getRunnerMode(),n="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 Ta(this.workingDirectory)&&await this.commitCurrentChangesWithAgent();const e=await Ca(this.workingDirectory),s=this.workspace.getInitialCommitHash();if(!s){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 Pa(this.workingDirectory,s,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 i=await Na(this.workingDirectory);this.log("info","MERGE",`Pushing branch ${i} to remote`),await za(this.workingDirectory,i,!1,this.options.input.gitServerId),this.log("info","MERGE","Successfully pushed branch to remote");const o=this.runner?.getAgentConfiguration(),r=Ja(s,(o?.customPRPromptTemplate?(t=o.customPRPromptTemplate,a={initialCommitHash:s,currentCommitHash:"",branchName:""},t.replace(/\{\{initialCommitHash\}\}/g,a.initialCommitHash).replace(/\{\{currentCommitHash\}\}/g,a.currentCommitHash).replace(/\{\{branchName\}\}/g,a.branchName)):void 0)??void 0);this.log("debug","MERGE",`PR prompt: ${r.substring(0,200)}...`);const c=this.runner;let p=null;const l=c.runStreamed(r,{cwd:this.workingDirectory,model:this.options.input.model,abortController:this.abortController,modeConfig:this.getRunnerModeConfig(),structuredOutputSchema:{type:"json_schema",schema:Ls}});for await(const e of l){if(this.logger.debug(`sdk message: ${JSON.stringify(e)}`),"result"===e.type){p=e;break}const t=n?e:this.messageFilter.filter(e);null!==t&&this.workClient.sendTaskEvent(this.getChatSenderMeta(),t,{groupId:this.currentGroupId??void 0})}if(!p)throw new Error("Merge-request did not return a result message");const d=Fs(p),u=await this.workClient.sendMergeRequest(d.title,d.description);this.workClient.sendAssistantMessage(`${d.userMessage}\n\n✅ Pull request created successfully!\nNumber: #${u.pullRequestNumber}\nURL: ${u.pullRequestUrl}`,{groupId:this.currentGroupId??void 0})}catch(e){const n=e instanceof Error?e.message:String(e);this.log("error","MERGE","Merge-request failed:",e),this.workClient.sendSystemErrorMessage(`❌ Merge-request failed: ${n}\n\nPlease check git status and try again, or create the PR manually.`,{groupId:this.currentGroupId??void 0})}var t,a}async executeBashCommand(e){if(!N.isDirectBashAllowed())return this.log("warn","BASH","Direct bash execution is disabled by global settings"),void this.workClient.sendSystemErrorMessage("Direct bash execution is disabled by global settings.",{groupId:this.currentGroupId??void 0});this.log("info","BASH",`Executing command: ${e}`);const n={senderType:"agent",senderId:"bash",senderName:"bash"},t=await Ya(e,this.workingDirectory,{onOutput:e=>{this.workClient.sendTaskMessage(n,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: ${t})`)}async executeMergePr(){await es({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"}),commitChanges:()=>this.commitCurrentChangesWithAgent()})}async commitCurrentChangesWithAgent(){this.log("info","MERGE","Generating commit message with agent"),await Qs({runner:this.runner,workingDirectory:this.workingDirectory,model:this.options.input.model,abortController:this.abortController,modeConfig:this.getRunnerModeConfig(),schemaTarget:"claude",onStreamMessage:async e=>{const n=this.taskAgentsMap.size>1?e:this.messageFilter.filter(e);null!==n&&this.workClient.sendTaskEvent(this.getChatSenderMeta(),n,{groupId:this.currentGroupId??void 0})}}),this.log("info","MERGE","Committed changes with agent-generated message")}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,n=this.runner,t=this.getRunnerModeConfig(),a="group_chat"===t.mode||"group_work"===t.mode,s=this.createPermissionHandler(),i=this.buildSystemHooks({trackBackgroundTasks:!0,trackPrimaryAgentStop:!0});this.initializePermissionModeState();const o=n.loop({cwd:this.workingDirectory,model:this.options.input.model,agentSessionId:e,abortController:this.abortController,initialPermissionMode:this.getPermissionModeSnapshot()??void 0,stderr:e=>{this.log("debug","SDK",e)},modeConfig:t,agentrixTools:this.agentrixTools,canUseTool:s,hooks:i,maxTurns:this.options.input.maxTurns??void 0});this.loopPermissionModeSetter=o.setPermissionMode??null,this.activePermissionMode=null,this.lastBroadcastPermissionMode=null,this.broadcastPermissionMode(this.getPermissionModeSnapshot()),await this.flushDesiredPermissionMode(),(async()=>{try{for(;!this.isStopping;){const e=await this.coordinator.waitForAgentMessage();if(!e){if(this.isStopping)break;continue}o.push(e);const n=e.__localSequence;void 0!==n&&(this.markPrimaryMessageProcessed(n),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.workClient.sendTaskSlashCommandsUpdate(Vs(e.slash_commands??[]),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 n=a?e:this.messageFilter.filter(e);null!==n&&this.workClient.sendTaskEvent(this.getChatSenderMeta(),n,{groupId:this.currentGroupId??void 0})}this.loopPermissionModeSetter=null,this.activePermissionMode=null,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 n=e,t=Array.isArray(n.questions)?n.questions:[];if(0===t.length)return this.log("warn","PERMISSION","AskUserQuestion missing questions"),{behavior:"deny",message:"AskUserQuestion missing questions"};const a=t.map(e=>({...e,options:[...e.options,{label:"Other",description:""}]}));try{const e=await this.askUser(a),s={};for(let n=0;n<t.length;n+=1){const a=t[n]?.question;if(!a)continue;const i=e.answers?.[n];"string"==typeof i&&(s[a]=i)}return{behavior:"allow",updatedInput:{...n,answers:s}}}catch(e){return this.log("warn","PERMISSION",`AskUserQuestion failed: ${e}`),{behavior:"deny",message:"AskUserQuestion failed"}}}createPermissionHandler(){return async(e,n)=>{if("AskUserQuestion"===e)return this.handleAskUserQuestionPermission(n);if("ExitPlanMode"===e)return this.handleExitPlanModePermission(n);if(this.grantedPermissions.has(e))return this.log("info","PERMISSION",`Tool "${e}" already granted, skipping`),{behavior:"allow",updatedInput:n};const t=this.pendingPermissions.get(e);if(t)return this.log("info","PERMISSION",`Tool "${e}" has pending request, waiting...`),"allow"===await t?{behavior:"allow",updatedInput:n}:{behavior:"deny",message:"Permission denied by user"};let a;this.log("info","PERMISSION",`Requesting permission for "${e}"`);const s=new Promise(e=>{a=e});this.pendingPermissions.set(e,s);try{const t=await this.requestToolPermission(e);return a(t),"allow"===t?(this.grantedPermissions.add(e),{behavior:"allow",updatedInput:n}):{behavior:"deny",message:"Permission denied by user"}}catch(e){return a("deny"),{behavior:"deny",message:"Permission request failed"}}finally{this.pendingPermissions.delete(e)}}}async handleExitPlanModePermission(e){const n=e.planFilePath??e.filePath;let t,a;if(n){const e=this.workspace.getCwd(),s=e.endsWith("/")?e:e+"/";t=n.startsWith(s)?n.slice(s.length):void 0;try{const e=await K.readFile(n,"utf-8");a=e.length>8e3?e.slice(0,8e3)+"\n\n…(truncated)":e}catch{}}!a&&"string"==typeof e.plan&&e.plan&&(a=e.plan);const s=[{question:"Review the plan and choose how to proceed.",header:"Plan Review",multiSelect:!1,options:[{label:"Approve",description:"Approve the plan and start implementation"},{label:"Revise",description:"Need to revise the plan",additionalInput:{enabled:!0,required:!1,placeholder:"Describe what should change."}},{label:"Cancel",description:"Cancel this plan"}],planFilePath:t,planContent:a}];try{const n=await this.askUser(s,{onTimeout:"abort_task"}),t=n.answers[0],a=n.details?.[0]?.trim();return"Approve"===t?{behavior:"allow",updatedInput:e}:"Revise"===t?{behavior:"deny",message:a?`The user wants to revise the plan. Revision notes: ${a}. Please reconsider and update the plan, then call ExitPlanMode again when ready.`:"The user wants to revise the plan. Please reconsider and update the plan, then call ExitPlanMode again when ready."}:(await this.restoreConfiguredPermissionMode(),{behavior:"deny",message:"User cancelled plan review",interrupt:!0})}catch{return await this.restoreConfiguredPermissionMode(),{behavior:"deny",message:"Plan review failed or was interrupted"}}}async requestToolPermission(e){const n=[{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(n,{onTimeout:"abort_task"})).answers[0]?"allow":"deny"}catch(e){return this.log("warn","PERMISSION",`Permission request failed: ${e}`),"deny"}}async askUser(e,n={}){const t=this.workClient;return ts(e,this.askUserAwaiter,{sendAskUser:e=>t.sendAskUser(this.getChatSenderMeta(),e,{groupId:this.currentGroupId??void 0}),sendAskUserResponse:(e,n)=>t.sendAskUserResponse(e,n),onTimeoutMessage:e=>t.sendAssistantMessage(e,{groupId:this.currentGroupId??void 0}),stopTask:e=>this.stopTask(e)},n)}async onUncommittedChanges(){const e=[{question:"Uncommitted changes detected in the working directory. How would you like to proceed?",header:"Git Status",multiSelect:!1,rememberSelection:{enabled:!0,defaultValue:!0},options:[{label:"Ignore",description:"Keep changes on current branch and continue without switching"},{label:"Commit",description:"Create a commit with an agent-generated message, 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 n=await this.askUser(e,{onTimeout:"abort_task"}),t=n.answers[0],a=n.rememberAnswers?.[0]??e[0]?.rememberSelection?.defaultValue??!1;return t.startsWith("other:")?(this.log("info","GIT",`User provided custom input: ${t}, defaulting to Abort`),{action:"Abort",remember:!1}):{action:{Ignore:"Ignore",Commit:"Commit",Stash:"Stash",Abort:"Abort"}[t]||"Abort",remember:a}}catch(e){return this.log("warn","GIT",`Failed to get user response for uncommitted changes: ${e}`),{action:"Abort",remember:!1}}}async onBranchMismatch(e){const n=[{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"}],t=[{question:`Branch mismatch detected. Current: ${e.currentBranch}. Expected: ${e.expectedBranch}. How would you like to proceed?`,header:"Git Branch",multiSelect:!1,rememberSelection:{enabled:!0,defaultValue:!0},options:n}];try{const e=await this.askUser(t,{onTimeout:"abort_task"}),n=e.answers[0],a=e.rememberAnswers?.[0]??t[0]?.rememberSelection?.defaultValue??!1;return n.startsWith("other:")?(this.log("info","GIT",`User provided custom input: ${n}, defaulting to Abort`),{action:"Abort",remember:!1}):{action:{Switch:"Switch",Keep:"Keep",Abort:"Abort"}[n]||"Abort",remember:a}}catch(e){return this.log("warn","GIT",`Failed to get user response for branch mismatch: ${e}`),{action:"Abort",remember:!1}}}getRunnerMode(){const e=this.taskAgentsMap.size>1,n=this.options.input.taskType,t=!(!process.env.AGENTRIX_COMPANION_HOME&&!process.env.AGENTRIX_COMPANION_WORKSPACE);return"shadow"===n?"companion_shadow":t&&"chat"===n?"companion_chat":e?"chat"===n?"group_chat":"group_work":"chat"===n?"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,n=this.options.input.userId,t=N.resolveDataDir(n,e);this.chatHistoryDb=Ot({dataDir:t,taskId:e})}return{createTask:pa(n={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),invokeAgent:(e,n)=>this.invokeAgent(e,n),assign:(e,n,t)=>this.assignWork(e,n,t),setPendingNavigateTaskId:e=>{this.pendingNavigateTaskId=e}}),createSoloTask:la(n),createGroupTask:da(n),replyToSubTask:ia(n),changeTaskTitle:sa(n),askUser:ua(n),getTaskHistory:oa(n),getTaskAgents:ra(n),listSubTask:ca(n),invoke:ma(n),assign:ha(n),updateAgentInfo:ga(n),sendReminder:va(n),listTasks:fa(n),readConversation:xa(n),uploadFile:ba(n),listAgents:ya(n)};var n}resolveTaskAgentName(e){return this.taskAgentsMap.get(e)?.name||""}getChatSenderMeta(){return{senderType:"agent",senderId:this.primaryAgentId,senderName:this.primaryAgentName}}sendAgentErrorMessage(e,n,t,a){const s=n||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}: ${t}`}]}};this.workClient.sendTaskMessage({senderType:"agent",senderId:e,senderName:s},i,{groupId:a?.groupId})}async invokeAgent(e,n){const t=this.buildSubAgentHistoryContext(e,n);if(!t)return!1;const a=this.taskAgentsMap.get(e),s=a?.type||"claude";let i=this.agentQueues.get(e);i||(i=new Bs,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 n=this.newMessageGroupId();try{const a=await js.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=Jt(),u=a.loop({cwd:this.workingDirectory,model:this.options.input.model,agentSessionId:t.sessionId,abortController:this.abortController,modeConfig:r,agentrixTools:this.agentrixTools,canUseTool:p,hooks:l,maxTurns:this.options.input.maxTurns??void 0});let m=t.message;if("codex"===s&&!t.sessionId){const n=[us(e,i),"=== CONVERSATION STREAM START FROM HERE ===",fs(t.message)].join("\n\n").trim();n&&(m=n)}u.push(m);const g=t.lastSequence;let h=!1;t.sessionId&&(this.historyDb.updateAgentLastSequence(e,g),h=!0);let f=!1;for await(const t of u.events){if("system"===t.type&&"init"===t.subtype){this.historyDb?.upsertAgentSession(e,t.session_id),h||(this.historyDb.updateAgentLastSequence(e,g),h=!0);continue}if("result"===t.type){this.workClient.sendTaskMessage({senderType:"agent",senderId:e,senderName:o},t,{groupId:n}),f=!0;break}const a=c?t:d.filter(t);a&&this.workClient.sendTaskEvent({senderType:"agent",senderId:e,senderName:o},a,{groupId:n})}}catch(n){this.log("error","INVOKE",`Invoke failed for ${e}:`,n)}finally{this.coordinator?.setAgentRunning(e,o,!1)}}),!0}async assignWork(e,n,t){const a=this.taskAgentsMap.get(e),s=a?.type||"claude";let i=this.agentQueues.get(e);i||(i=new Bs,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();var i;t&&this.workClient.sendTaskMessage({senderType:"agent",senderId:e,senderName:o},(i=t,{type:"assistant",session_id:"",uuid:crypto.randomUUID(),parent_tool_use_id:null,message:{role:"assistant",content:[{type:"text",text:i}]}}),{groupId:this.newMessageGroupId()});try{const t=await js.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=Jt(),d=t.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(n);let u=!1;for await(const n of d.events){if("system"===n.type&&"init"===n.subtype)continue;if("result"===n.type){this.workClient.sendTaskMessage({senderType:"agent",senderId:e,senderName:o},n,{groupId:a}),u=!0;break}const t=c?n:l.filter(n);t&&this.workClient.sendTaskEvent({senderType:"agent",senderId:e,senderName:o},t,{groupId:a})}}catch(n){this.log("error","RUN_TASK",`Run task failed for ${e}:`,n);const t=n instanceof Error?n.message:String(n);this.sendAgentErrorMessage(e,o,`I meet some error: ${t}`,{groupId:a})}finally{this.coordinator?.setAgentRunning(e,o,!1)}})}buildSubAgentHistoryContext(e,n){const t=this.historyDb;if(!t)return this.log("warn","HISTORY","Task history DB unavailable; delegate cannot build context."),null;const a=t.getAgentSessions().get(e),s=t.getAgentLastSequences().get(e)??0,i=t.pageRecentMessagesAfter(s,20);if(0===i.data.length&&!n)return null;const o=this.mergeConsecutiveHumanMessages(i.data),r=this.buildHistoryMessages(o,n);return r?{message:r,sessionId:a,lastSequence:i.data.length>0?i.data[i.data.length-1].localSequence:s}:null}buildHistoryMessages(e,n){const t=[];for(const n of e){const e=Qt(n);e&&t.push(e)}if(0===t.length&&!n)return null;let a=t.join("\n");return n&&(a=`<hint>\n${n}\n</hint>\n\n${a}`),{type:"user",message:{role:"user",content:a},parent_tool_use_id:null,session_id:""}}buildSystemHooks(e){const n=e?.trackBackgroundTasks??!0,t=e?.trackPrimaryAgentStop??!1,a={};return n&&(a.PostToolUse=async e=>(this.syncPermissionModeFromPostToolUse(e),this.trackBackgroundTaskFromPostToolUse(e),{})),t&&(a.Stop=async()=>(this.updateAgentRunning(!1),{})),a}trackBackgroundTaskFromPostToolUse(e){if(!e||"object"!=typeof e)return void this.log("debug","TASK","PostToolUse hook input is not an object");const n=e,t=n.tool_input;if(!t||!0!==t.run_in_background)return;const a=this.extractBackgroundTaskId(n.tool_response);if(!a)return this.log("debug","TASK",`PostToolUse(${n.tool_name}) run_in_background=true but no task_id found, using anonymous tracking`),void this.coordinator?.setAnonymousBackgroundTaskRunning(!0);this.coordinator?.setBackgroundTaskRunning(a,!0),this.log("info","TASK",`Background task started: ${a} (tool: ${n.tool_name})`)}syncPermissionModeFromPostToolUse(e){if(!e||"object"!=typeof e)return;const n=(t=e.tool_name,a=this.configuredPermissionMode,"EnterPlanMode"===t?"plan":"ExitPlanMode"===t?a:null);var t,a;n&&this.confirmPermissionModeApplied(n)}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 n=new Set,t=new Set,a=e=>{if("string"!=typeof e)return;const t=e.trim();t&&n.add(t)},s=e=>{if(null==e)return;if("string"==typeof e)return void(e=>{const n=/(task[_-]?id|agent[_-]?id|shell[_-]?id)["'\s:=]+([A-Za-z0-9._:-]+)/gi;let t;for(;null!==(t=n.exec(e));)a(t[2])})(e);if("object"!=typeof e)return;if(t.has(e))return;if(t.add(e),Array.isArray(e)){for(const n of e)s(n);return}const n=e;"string"==typeof n.task_id&&a(n.task_id),"string"==typeof n.taskId&&a(n.taskId),"string"==typeof n.agent_id&&a(n.agent_id),"string"==typeof n.agentId&&a(n.agentId),"string"==typeof n.shell_id&&a(n.shell_id),"string"==typeof n.shellId&&a(n.shellId);for(const e of Object.values(n))s(e)};s(e);const i=[...n];return i.length>1&&this.log("warn","TASK",`Multiple background task ids extracted (${i.join(", ")}), using first id ${i[0]}`),i[0]}createWorkerClientConfig(e,n,t){const a=this.options.input.agentId,s=this.taskAgentsMap.get(a)?.name;return{config:{userId:e,taskId:n,chatId:this.options.input.chatId,machineId:this.credentials.machineId,agentId:a,agentName:s,cwd:t,serverUrl:N.serverUrl.replace(/^http/,"ws"),path:"/v1/ws",auth:M(this.credentials.token,this.credentials.machineId,n),dataEncryptionKey:this.options.dataEncryptionKey??null,keepAliveConfig:{intervalMs:2e4,event:"worker-alive",payloadGenerator:()=>{const e=this.coordinator?.getStatus(),t="running"===e?.state?"worker-running":"worker-ready";return{eventId:d(),status:t,taskId:n,machineId:this.credentials.machineId,timestamp:Date.now().toString(),activeAgents:this.coordinator?.getActiveAgents(),permissionMode:this.getPermissionModeSnapshot()}}},healthCheckConfig:{enabled:!0,intervalMs:3e4,timeoutMs:5e3},logger:(e,...n)=>this.logger.info(`[SOCKET] ${e}`,...n)},handlers:{attachmentsDir:N.resolveAttachmentsDir(e,n),logger:(e,n,t,...a)=>{this.log(e,n,t,...a)},stopTask:async()=>{this.stopTask("event")},shouldPersistTaskMessage:async e=>!E(e)||!this.shouldDropHeartbeatWhileBusy()||(this.log("debug","WORKER","Dropping heartbeat at WorkerClient receive stage: agent is running"),!1),onTaskMessage:async(e,n)=>{if(w(e)){const[n,t]=this.askUserAwaiter.entries().next().value||[];n&&t&&(this.askUserAwaiter.delete(n),t(e))}},onTaskInfoUpdate:async e=>{ns(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 n=Xt(e,this.options.dataEncryptionKey);await this.coordinator.enqueue(n)}}}}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,n,t,...a){this.logger&&this.logger[e](`[${n}] ${t}`,...a)}get taskId(){return this.options.input.taskId}async handleSdkResultMessage(e){let n,t;try{const e=await this.workspace.prepareResultArtifacts({onPatchError:e=>{this.log("warn","GIT","Failed to write patch diff for result:",e)}});n=e.artifacts,t=e.artifactVersion}catch(e){this.log("warn","GIT","Failed to prepare git artifacts for result:",e)}const a=this.getRunnerMode(),s="group_chat"===a||"group_work"===a,i=this.pendingNavigateTaskId;if(this.pendingNavigateTaskId=null,s?this.workClient.sendTaskEvent(this.getChatSenderMeta(),e,{...n?{artifacts:n}:{},groupId:this.currentGroupId??void 0,navigateToTaskId:i??void 0}):this.workClient.sendTaskMessage(this.getChatSenderMeta(),e,{...n?{artifacts:n}:{},groupId:this.currentGroupId??void 0,navigateToTaskId:i??void 0}),t)try{await Xa(this.options.input.userId,this.taskId,t)}catch(e){this.log("warn","GIT","Failed to mark artifact version as sent:",e)}}}class ni{static async calculateFinalCwd(e){const{repositorySourceType:n,cwd:t,userCwd:a,userId:s,taskId:i,forceUserCwd:o}=e;if(t)return t;const r=N.resolveProjectDir(s,i);if("directory"===n&&a){const e=a.replace(/^~/,ee());return o?e:await this.shouldUseWorktree(e)?r:e}return r}static async shouldUseWorktree(e){try{return!Aa(e)&&await ka(e)}catch{return!1}}}var ti=kn(L);class ai{constructor(e,n){this.credentials=e,this.options=n}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-${$()}`}async start(){try{await this.initialize(),await this.handleEvent(),await this.runCodex(),await this.exitWorker("completed")}catch(e){if(!this.isStopping){this.isStopping=!0,this.askUserAwaiter.clear(),this.coordinator?.stop(),this.log("warn","AGENT","Fatal error:",e);const n=e instanceof Error?e.message:String(e);throw await this.exitWorker("error",n),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,n=this.options.input.userId;this.logger=this.createLogger({type:"worker",taskId:e}),this.dataEncryptionKey=this.options.dataEncryptionKey??null;const t=Wa(this.options.input),a=await ni.calculateFinalCwd(t),s={...t,cwd:a};this.log("info","INIT",`Phase 1: Working directory: ${a}`);const i=this.createWorkerClientConfig(n,e,a),o=N.resolveDataDir(n,e);this.historyDb=Ot({dataDir:o,taskId:e});const r=new zt(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 Us({options:s,handlers:this.createWorkspaceHandlers(r,a)}),{initialCommitHash:l,gitStateResult:d}=await p.setup();this.workspace=p,this.log("info","INIT","Phase 7: Workspace setup complete"),r.sendWorkerInitialized(),r.sendTaskSlashCommandsUpdate(Vs()),this.log("info","INIT","Phase 8: Initialization finalized"),await this.registerWithDaemon(a),this.log("info","INIT","Phase 9: Registered with daemon"),this.context={credentials:this.credentials,options:this.options,workClient:r,workingDirectory:a,initialCommitHash:l,logger:this.logger},process.env.AGENTRIX_WORKING_DIR=a,process.env.AGENTRIX_WORKING_USER=n,process.env.AGENTRIX_WORKING_TASK=e,this.options.input.environmentVariables&&Object.entries(this.options.input.environmentVariables).forEach(([e,n])=>{null!=n&&(process.env[e]=String(n))}),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,n){return{onRepositoryDetected:n=>{e.associateRepository(n.host,n.owner,n.repo,n.url)},onUncommittedChanges:this.onUncommittedChanges.bind(this),onCommitUncommittedChanges:async()=>this.commitCurrentChangesWithAgent(n),onBranchMismatch:this.onBranchMismatch.bind(this)}}async registerWithDaemon(e){const n=this.options.input.taskId,t=await un(n,{cwd:e,machineId:this.credentials.machineId,pid:process.pid,startedBy:this.options.startedBy||"terminal"});t.error?this.log("warn","DAEMON",`Failed to report session ${n}:`,t.error):this.log("info","DAEMON",`Session ${n} registered`)}createMessageCoordinator(e,n){return this.coordinator=new Qa({workerType:"codex",workClient:e,handlers:{onNormalMessage:async e=>this.convertSDKMessageToCodexInput(e),onBashCommand:async(e,n)=>{await this.executeBashCommand(e)},onMergeRequest:async e=>{await this.executeMergeRequest()},onMergePr:async()=>{await this.executeMergePr()},onNewSession:async()=>{await this.executeNewSession()}},logger:(e,n,t)=>{const a=e;this.log(a,n,t)},idleTimeoutMs:n,onIdleTimeout:()=>this.stopTask("idle")}),this.coordinator}async handleEvent(){if("task-message"===this.options.input.event){const e=this.options.input.eventData.message;e&&k(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 Ta(this.context.workingDirectory)&&await this.commitCurrentChangesWithAgent();const e=await Ca(this.context.workingDirectory),n=this.context.initialCommitHash,t=await Na(this.context.workingDirectory);if(this.log("info","MERGE",`Pushing branch ${t} to remote`),await za(this.context.workingDirectory,t,!1,this.options.input.gitServerId),this.log("info","MERGE","Successfully pushed branch to remote"),!n){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 Pa(this.context.workingDirectory,n,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 a=Ja(n);this.log("debug","MERGE",`PR prompt: ${a.substring(0,200)}...`);const s=this.options.input.agentId??"default",i=await js.create("codex",s),o={mode:"work",supportChangeTitle:!1},r=i.runStreamed(a,{cwd:this.context.workingDirectory,model:this.currentModel||void 0,abortController:this.abortController,modeConfig:o,structuredOutputSchema:{type:"json_schema",schema:Ws}});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 n=this.filterMessages(e);null!==n&&this.context.workClient.sendTaskEvent(this.getChatSenderMeta(),n,{groupId:this.currentGroupId??void 0})}if(!c)throw new Error("Merge-request did not return a result message");const p=Fs(c);await this.createPullRequest(p.title,p.description),this.sendMessage(p.userMessage)}catch(e){const n=e instanceof Error?e.message:String(e);this.log("error","MERGE","Merge-request failed:",e),this.context.workClient.sendSystemErrorMessage(`Merge-request failed: ${n}\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){if(!N.isDirectBashAllowed())return this.log("warn","BASH","Direct bash execution is disabled by global settings"),void this.context.workClient.sendSystemErrorMessage("Direct bash execution is disabled by global settings.",{groupId:this.currentGroupId??void 0});this.log("info","BASH",`Executing command: ${e}`);const n=await Ya(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: ${n})`)}async executeMergePr(){await es({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"}),commitChanges:()=>this.commitCurrentChangesWithAgent()})}async commitCurrentChangesWithAgent(e){const n=this.options.input.agentId??"default",t=await js.create("codex",n),a=e||this.context?.workingDirectory;if(!a)throw new Error("Working directory is not available for commit generation");this.log("info","MERGE","Generating commit message with agent"),await Qs({runner:t,workingDirectory:a,model:this.currentModel||this.options.input.model||void 0,abortController:this.abortController,modeConfig:{mode:"work",supportChangeTitle:!1},schemaTarget:"openai",onStreamMessage:async e=>{const n=this.filterMessages(e);null!==n&&this.getActiveWorkClient().sendTaskEvent(this.getChatSenderMeta(),n,{groupId:this.currentGroupId??void 0})}}),this.log("info","MERGE","Committed changes with agent-generated message")}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",n=(await js.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)n.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 n.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.context.workClient.sendTaskSlashCommandsUpdate(Vs(e.slash_commands??[]),e.session_id),this.log("info","AGENT",`Thread started: ${e.session_id}`),this.refreshGroupId(),this.updateAgentRunning(!0);continue}const n=this.filterMessages(e);null!==n&&("result"===e.type?await this.handleSdkResultMessage(n):this.context.workClient.sendTaskEvent(this.getChatSenderMeta(),n,{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 n=e,t=n?.message?.content;if(!t||"string"==typeof t)return e;const a=t.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"===n.type&&"tool_result"!==e.type));return 0===a.length?null:(n.message.content=a,n)}sendMessage(e){const n={type:"assistant",message:{id:$().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:$().toString()};this.getActiveWorkClient().sendTaskMessage(this.getChatSenderMeta(),n,{groupId:this.currentGroupId??void 0})}async askUser(e,n={}){const t=this.getActiveWorkClient();return ts(e,this.askUserAwaiter,{sendAskUser:e=>t.sendAskUser(this.getChatSenderMeta(),e,{groupId:this.currentGroupId??void 0}),sendAskUserResponse:(e,n)=>t.sendAskUserResponse(e,n),onTimeoutMessage:e=>this.sendMessage(e),stopTask:e=>this.stopTask(e)},n)}getActiveWorkClient(){const e=this.context?.workClient??this.workClient;if(!e)throw new Error("[WORKER] WorkerClient not available");return e}resolveTaskAgentName(e){const n=this.options.input.taskAgents??[];return n.find(n=>n.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,rememberSelection:{enabled:!0,defaultValue:!0},options:[{label:"Ignore",description:"Keep changes on current branch and continue without switching"},{label:"Commit",description:"Create a commit with an agent-generated message, 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 n=await this.askUser(e,{onTimeout:"abort_task"}),t=n.answers[0],a=n.rememberAnswers?.[0]??e[0]?.rememberSelection?.defaultValue??!1;return t.startsWith("other:")?(this.log("info","GIT",`User provided custom input: ${t}, defaulting to Abort`),{action:"Abort",remember:!1}):{action:{Ignore:"Ignore",Commit:"Commit",Stash:"Stash",Abort:"Abort"}[t]||"Abort",remember:a}}catch(e){return this.log("warn","GIT",`Failed to get user response for uncommitted changes: ${e}`),{action:"Abort",remember:!1}}}async onBranchMismatch(e){const n=[{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"}],t=[{question:`Branch mismatch detected. Current: ${e.currentBranch}. Expected: ${e.expectedBranch}. How would you like to proceed?`,header:"Git Branch",multiSelect:!1,rememberSelection:{enabled:!0,defaultValue:!0},options:n}];try{const e=await this.askUser(t,{onTimeout:"abort_task"}),n=e.answers[0],a=e.rememberAnswers?.[0]??t[0]?.rememberSelection?.defaultValue??!1;return n.startsWith("other:")?(this.log("info","GIT",`User provided custom input: ${n}, defaulting to Abort`),{action:"Abort",remember:!1}):{action:{Switch:"Switch",Keep:"Keep",Abort:"Abort"}[n]||"Abort",remember:a}}catch(e){return this.log("warn","GIT",`Failed to get user response for branch mismatch: ${e}`),{action:"Abort",remember:!1}}}async createPullRequest(e,n){this.log("info","MERGE",`Creating PR: ${e}`);try{const t=await this.context.workClient.sendMergeRequest(e,n);this.sendMessage(`✅ Pull request created successfully!\nNumber: #${t.pullRequestNumber}\nURL: ${t.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 n=e.message.content;if("string"==typeof n)return n;if(Array.isArray(n)){const e=[],t=N.resolveAttachmentsDir(this.options.input.userId,this.taskId);for(const a of n)if("text"===a.type&&a.text)e.push(a.text);else if("image"===a.type&&a.source&&a.source.url){const n=a.source.url;try{const{filePath:a}=await Ht(n,t,!1);this.log("info","IMAGE",`Downloaded image from ${n} to ${a}`),e.push(`Image: ${a}`)}catch(e){this.log("error","IMAGE",`Failed to download image from ${n}:`,e)}}else if("document"===a.type&&a.source&&a.source.url){const n=a.source.url;try{const{filePath:s,mimeType:i,filename:o}=await Ht(n,t,!0);this.log("info","DOCUMENT",`Downloaded document from ${n} to ${s}`);const r=a.title||o;e.push(`Document: ${s}\nTitle: ${r}\nType: ${i}`)}catch(e){this.log("error","DOCUMENT",`Failed to download document from ${n}:`,e)}}const a=e.map(e=>e.trim()).filter(Boolean).join("\n\n").trim();if(a)return a}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,n,t){const a=this.options.input.agentId,s=this.options.input.taskAgents?.find(e=>e.id===a)?.name;return{config:{userId:e,taskId:n,chatId:this.options.input.chatId,machineId:this.credentials.machineId,agentId:a,agentName:s,cwd:t,serverUrl:N.serverUrl.replace(/^http/,"ws"),path:"/v1/ws",auth:M(this.credentials.token,this.credentials.machineId,n),dataEncryptionKey:this.dataEncryptionKey,keepAliveConfig:{intervalMs:2e4,event:"worker-alive",payloadGenerator:()=>{const e=this.coordinator?.getStatus(),t="running"===e?.state?"worker-running":"worker-ready";return{eventId:d(),status:t,taskId:n,machineId:this.credentials.machineId,timestamp:Date.now().toString()}}},healthCheckConfig:{enabled:!0,intervalMs:3e4,timeoutMs:5e3},logger:(e,...n)=>(this.context?.logger??this.logger)?.info(`[SOCKET] ${e}`,...n)},handlers:{stopTask:async()=>{this.stopTask("event")},onTaskMessage:async e=>{if(w(e)){const[n,t]=this.askUserAwaiter.entries().next().value||[];return void(n&&t&&(this.askUserAwaiter.delete(n),t(e)))}k(e)&&"user"===e.type&&await this.coordinator.enqueue(e)},onTaskInfoUpdate:async e=>{ns(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,n){this.coordinator&&this.coordinator.stop(),this.log("info","WORKER",`Exiting with status: ${e} for task ${this.taskId}`),"error"===e&&n?await this.context.workClient.sendErrorMessageAndExit(n):(this.context.workClient.sendWorkerExit(e),await this.context.workClient.disconnect()),this.historyDb&&this.historyDb.close()}createLogger(e){const{createLogger:n}=ti;return n(e)}log(e,n,t,...a){const s=this.context?.logger??this.logger;s&&s[e](`[${n}] ${t}`,...a)}get taskId(){return this.options.input.taskId}getCurrentModel(){return this.currentModel||"gpt-5"}async handleSdkResultMessage(e){let n,t;try{const e=await this.workspace.prepareResultArtifacts({onPatchError:e=>{this.log("warn","GIT","Failed to write patch diff for result:",e)}});n=e.artifacts,t=e.artifactVersion}catch(e){this.log("warn","GIT","Failed to prepare git artifacts for result:",e)}if(this.context.workClient.sendTaskMessage(this.getChatSenderMeta(),e,{...n?{artifacts:n}:{},groupId:this.currentGroupId??void 0}),t)try{await Xa(this.options.input.userId,this.taskId,t)}catch(e){this.log("warn","GIT","Failed to mark artifact version as sent:",e)}}}const si=["claude","codex","deployment","companion"],ii={claude:{async run({credentials:e,startedBy:n,userId:t,taskId:a,idleTimeoutSecond:s}){const i=N.readTaskInput(t,a),o=i.dataEncryptionKey?p(i.dataEncryptionKey):null;if(o&&32!==o.length)throw new Error("Invalid dataEncryptionKey: expected decrypted 32-byte key");const r={startedBy:n,idleTimeoutSecond:s,input:i,dataEncryptionKey:o};await async function(e,n){const t=Wa(n.input),a=await ni.calculateFinalCwd(t),s=new ei(e,n,a);await s.start()}(e,r)}},codex:{async run({credentials:e,startedBy:n,userId:t,taskId:a,idleTimeoutSecond:s}){const i=N.readTaskInput(t,a),o=i.dataEncryptionKey?p(i.dataEncryptionKey):null;if(o&&32!==o.length)throw new Error("Invalid dataEncryptionKey: expected decrypted 32-byte key");const r={startedBy:n,idleTimeoutSecond:s,input:i,dataEncryptionKey:o};await async function(e,n){const t=new ai(e,n);await t.start()}(e,r)}},deployment:{async run({credentials:e,startedBy:n,userId:t,taskId:a,idleTimeoutSecond:s}){const i={input:N.readTaskInput(t,a)};await async function(e,n){const t=n.input,{taskId:a,sourcePath:s,targetAgentId:i,userId:o,name:r,avatar:c,isSystemAgent:p,supportLocal:l}=t;let u=null;try{if(console.log(`[Deployment] Starting deployment worker for task ${a}`),!ie.existsSync(s))throw new Error(`Source path not found: ${s}`);const n=xe.join(N.agentrixAgentsHomeDir,i);if(ie.existsSync(n))throw new Error(`Target agent directory already exists: ${n}`);console.log(`[Deployment] Copying from ${s} to ${n}`),await Zs(s,n),console.log("[Deployment] Deployment completed successfully"),u=function(e,n,t){const a=N.serverUrl.replace(/^http/,"ws");return te(a,{path:"/v1/ws",transports:["websocket"],auth:{token:e.token,clientType:"worker",machineId:e.machineId,taskId:t}})}(e,0,a),await new Promise((e,n)=>{const t=setTimeout(()=>{n(new Error("WebSocket connection timeout"))},1e4);u.on("connect",()=>{clearTimeout(t),console.log("[Deployment] Connected to server"),u.emit("deploy-agent-complete",{eventId:d(),taskId:a,targetAgentId:i,success:!0,name:r,avatar:c,isSystemAgent:p,supportLocal:l}),console.log("[Deployment] Sent deploy-agent-complete event"),setTimeout(()=>{e()},1e3)}),u.on("connect_error",e=>{clearTimeout(t),n(e)})})}catch(e){throw console.error("[Deployment] Deployment failed:",e),u&&u.connected&&(u.emit("deploy-agent-complete",{eventId:d(),taskId:a,targetAgentId:i,success:!1,error:e instanceof Error?e.message:String(e)}),await new Promise(e=>setTimeout(e,1e3))),e}finally{u&&u.disconnect(),process.exit(0)}}(e,i)}},companion:{async run({credentials:e,startedBy:n,userId:t,taskId:a,idleTimeoutSecond:s}){const i=N.readTaskInput(t,a),o=i.dataEncryptionKey?p(i.dataEncryptionKey):null;if(o&&32!==o.length)throw new Error("Invalid dataEncryptionKey: expected decrypted 32-byte key");const r={startedBy:n,idleTimeoutSecond:s,input:i,dataEncryptionKey:o};await async function(e,n){const{agentDir:t,homeDir:a}=await Mt();n.input.agentDir=t,process.env.AGENTRIX_COMPANION_HOME=a;const s=Wa(n.input),i=await ni.calculateFinalCwd(s),o=new ei(e,n,i);await o.start()}(e,r)}}};async function oi(){const e=function(){try{const e=J(j(),"package.json"),n=JSON.parse(B(e,"utf-8"));if("string"==typeof n.version&&n.version.trim().length>0)return n.version}catch{}return"0.0.0"}();try{const n=Ae("npm view @agentrix/cli version",{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}).trim();return{hasUpgrade:function(e,n){const t=e.split(".").map(Number),a=n.split(".").map(Number);for(let e=0;e<Math.max(t.length,a.length);e++){const n=t[e]||0,s=a[e]||0;if(n>s)return 1;if(n<s)return-1}return 0}(n,e)>0,currentVersion:e,latestVersion:n}}catch(n){return{hasUpgrade:!1,currentVersion:e,latestVersion:null}}}function ri(){return"true"===process.env.AGENTRIX_DISABLE_AUTO_UPGRADE}async function ci(e){try{const{execSync:n}=await import("child_process");return console.log(""),e||(console.log(s.blue("🔄 Checking for upgrades...")),e=await oi()),e.hasUpgrade?(console.log(s.blue(`🔄 Upgrading from ${e.currentVersion} to ${e.latestVersion}...`)),n("npm install -g @agentrix/cli@latest",{stdio:"inherit"}),console.log(s.green("✓ Upgrade complete")),console.log(""),!0):(console.log(s.green("✓ Already on latest version")),console.log(""),!0)}catch(e){return console.log(""),console.log(s.yellow("⚠️ Auto-upgrade failed")),console.log(s.dim(" You can upgrade manually with: npm install -g @agentrix/cli@latest")),console.log(""),!1}}async function pi(e,n){const t=`${N.serverUrl}/v1/agents/${encodeURIComponent(e)}/git-url`,a=await fetch(t,{headers:{Authorization:`Bearer ${n.token}`}});return a.ok?a.json():null}function li(e){try{const n=re(ve(e,"agent.json"),"utf-8"),t=JSON.parse(n);return"string"==typeof t.version?t.version:null}catch{return null}}function di(e,n){const t=e=>e.split(".").map(e=>parseInt(e,10)||0),a=t(e),s=t(n);for(let e=0;e<Math.max(a.length,s.length);e++){const n=a[e]??0,t=s[e]??0;if(n>t)return!0;if(n<t)return!1}return!1}async function ui(e){const n=N.agentrixAgentsHomeDir;if(!oe(n))return;let t;try{t=de(n).filter(e=>ce(ve(n,e)).isDirectory())}catch{return}for(const a of t){if("companion"===a||a.startsWith("draftagent-")||a.includes("."))continue;const t=ve(n,a),s=ve(t,"upgrade");if(oe(s))continue;const i=li(t);O.info(`[AGENT UPDATE] Checking ${a} (local version: ${i??"unknown"})`);try{const n=await pi(a,e);if(!n||!n.gitUrl){O.info(`[AGENT UPDATE] No git repo for ${a}, skipping`);continue}const t=`${s}.tmp-${Date.now()}`;try{const e=["git","clone","--depth=1","--branch",n.branch,n.gitUrl,t];qe(e.join(" "),{stdio:"pipe",timeout:12e4});const o=n.subDir?ve(t,n.subDir):t;if(n.subDir&&!oe(o))throw new Error(`subDir "${n.subDir}" not found in cloned repo`);const r=li(o);if(!r||i&&!di(r,i)){O.info(`[AGENT UPDATE] ${a} up to date (local: ${i??"unknown"}, remote: ${r??"unknown"})`),me(t,{recursive:!0,force:!0});continue}O.info(`[AGENT UPDATE] Update available for ${a}: ${i??"unknown"} → ${r}`),n.subDir?(ue(o,s),me(t,{recursive:!0,force:!0})):ue(t,s),O.info(`[AGENT UPDATE] Staged upgrade for ${a}`)}catch(e){throw oe(t)&&me(t,{recursive:!0,force:!0}),e}}catch(e){O.warn(`[AGENT UPDATE] Check failed for ${a}: ${e}`)}}}function mi(){const e=N.getStatePaths();return X.join(X.dirname(e.daemonStateFile),"upgrade-daemon.state.json")}function gi(){try{const e=mi();if(!H.existsSync(e))return null;const n=H.readFileSync(e,"utf-8");return JSON.parse(n)}catch{return null}}function hi(e){try{const n=mi();if(H.existsSync(n)){if("number"==typeof e){const n=gi();if(!n||n.pid!==e)return}H.unlinkSync(n)}}catch{}}function fi(e){try{return process.kill(e,0),!0}catch{return!1}}function xi(){const e=gi();return!(!e||!fi(e.pid)&&(hi(),1))}function vi(){const e=gi();if(e)try{fi(e.pid)&&process.kill(e.pid,"SIGTERM")}catch{}finally{hi()}}async function bi(){if(ri())return"no-upgrade";const e=await oi();if(e.hasUpgrade&&await ci(e))return await fn(),await new Promise(e=>setTimeout(e,1e3)),Dt(["daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref(),"upgraded";try{const e=await N.readCredentials();e&&await ui(e)}catch{}return"no-upgrade"}var yi=Object.freeze({__proto__:null,isUpgradeDaemonRunning:xi,startUpgradeDaemon:async function(){await async function(){!function(e){const n=mi();H.writeFileSync(n,JSON.stringify(e,null,2))}({pid:process.pid,startedAt:(new Date).toISOString()}),process.on("SIGTERM",()=>{hi(process.pid),process.exit(0)}),process.on("SIGINT",()=>{hi(process.pid),process.exit(0)});try{"upgraded"===await bi()&&(Dt(["upgrade-daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref(),process.exit(0))}catch(e){}for(;;){await new Promise(e=>setTimeout(e,216e5));try{"upgraded"===await bi()&&(Dt(["upgrade-daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref(),process.exit(0))}catch(e){}}}()},stopUpgradeDaemon:vi});const wi=t(a(process.argv)).scriptName("agentrix").version(q.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");N.getStatePaths,wi.command("upgrade","Upgrade CLI to the latest version",{},async e=>{console.log(s.dim(`Current version: ${q.version}`));const n=await mn();await ci()||process.exit(1);try{const e=await N.readCredentials();e&&(console.log(s.dim("Checking agent updates...")),await ui(e))}catch{}if(n){console.log(s.blue("Restarting daemon...")),await fn(),await new Promise(e=>setTimeout(e,1e3)),Dt(["daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref();let e=!1;for(let n=0;n<50;n++)if(await new Promise(e=>setTimeout(e,100)),await mn()){e=!0;break}e?console.log(s.green("✓ Daemon restarted successfully")):console.log(s.yellow("⚠️ Daemon may still be starting. Run 'agentrix status' to check."))}try{const{version:e}=await import("./logger-BNXbkPSk.mjs").then(function(e){return e._});console.log(s.green(`\n✓ Now running version: ${e}`))}catch{console.log(s.dim("\nRun 'agentrix --version' to see the new version"))}process.exit(0)}),wi.command("doctor","System diagnostics & troubleshooting",{},async e=>{await it(),process.exit(0)}),wi.command("logout","Logout from Agentrix",{},async e=>{try{await async function(){if(!await N.readCredentials())return void console.log(s.yellow("Not currently authenticated"));console.log(s.blue("This will log you out of Agentrix")),console.log(s.yellow("⚠️ You will need to re-authenticate to use Agentrix again"));const e=W({input:process.stdin,output:process.stdout}),n=await new Promise(n=>{e.question(s.yellow("Are you sure you want to log out? (y/N): "),n)});if(e.close(),"y"===n.toLowerCase()||"yes"===n.toLowerCase())try{try{await fn(),console.log(s.gray("Stopped daemon"))}catch{}await N.clearCredentials(),console.log(s.gray("Removed credentials")),console.log(s.green("✓ Successfully logged out"))}catch(e){throw new Error(`Failed to logout: ${e instanceof Error?e.message:"Unknown error"}`)}else console.log(s.blue("Logout cancelled"))}()}catch(e){console.error(s.red("Error:"),e instanceof Error?e.message:"Unknown error"),process.env.DEBUG&&console.error(e),process.exit(1)}process.exit(0)}),wi.command("stop","Stop the daemon",{},async e=>{vi(),await fn(),process.exit(0)}),wi.command("status","Show daemon and authentication status",{},async e=>{await it("daemon"),console.log(""),await async function(){const e=await N.readCredentials();if(console.log(s.bold("\nAuthentication Status\n")),!e)return void console.log(s.red("✗ Not authenticated"));console.log(s.green("✓ Authenticated"));const n=e.token.substring(0,30)+"...";console.log(s.gray(` Token: ${n}`)),e.machineId?(console.log(s.green("✓ Machine registered")),console.log(s.gray(` Machine ID: ${e.machineId}`)),console.log(s.gray(` Host: ${Q.hostname()}`))):console.log(s.yellow("⚠️ Machine not registered")),console.log(s.gray(`\n Data directory: ${N.agentrixHomeDir}`));try{await mn()?console.log(s.green("✓ Daemon running")):console.log(s.gray("✗ Daemon not running"))}catch{console.log(s.gray("✗ Daemon not running"))}}(),process.exit(0)}),wi.command("ls","List active sessions",{},async e=>{try{const e=await async function(){return(await dn("/list")).children||[]}();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)}),wi.command("killall","Clean up all runaway agentrix processes",{},async()=>{const e=await async function(){const e=await async function(){return(await nt()).filter(e=>e.pid!==process.pid&&("daemon"===e.type||"worker"===e.type||"upgrade-daemon"===e.type)).map(e=>({pid:e.pid,command:e.command}))}(),n=[];let t=0;for(const{pid:a,command:s}of e)try{if(console.log(`Killing runaway process PID ${a}: ${s}`),"win32"===process.platform){const e=Pe.sync("taskkill",["/F","/PID",a.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(a,"SIGTERM"),await new Promise(e=>setTimeout(e,1e3)),(await Me()).find(e=>e.pid===a)&&(console.log(`Process PID ${a} ignored SIGTERM, using SIGKILL`),process.kill(a,"SIGKILL"));console.log(`Successfully killed runaway process PID ${a}`),t++}catch(e){const t=e.message;n.push({pid:a,error:t}),console.log(`Failed to kill process PID ${a}: ${t}`)}return{killed:t,errors:n}}();console.log(`Cleaned up ${e.killed} runaway processes`),e.errors.length>0&&console.log("Errors:",e.errors),process.exit(0)}),wi.command("kill <sessionId>","Stop a specific session",e=>e.positional("sessionId",{type:"string",describe:"Session ID to stop"}),async e=>{try{const n=await async function(e){return(await dn("/stop-session",{sessionId:e})).success||!1}(e.sessionId);console.log(n?s.green("✓ Session stopped"):s.red("Failed to stop session"))}catch(e){console.log(s.red("No daemon running"))}process.exit(0)}),wi.command("daemon",!1,{},async e=>{try{await bn()}catch(e){console.error(s.red("Error:"),e instanceof Error?e.message:"Authentication failed"),process.env.DEBUG&&console.error(e),process.exit(1)}await Wt(),process.exit(0)}),wi.command("worker",!1,e=>e.option("type",{type:"string",choices:si,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 n=e.type,t=ii[n];if(!t)throw new Error(`Unsupported worker type: ${String(e.type)}`);const a=e["started-by"],s=await bn(),i=e["user-id"],o=e["task-id"],r=e["idle-timeout"];await t.run({credentials:s,startedBy:a,userId:i,taskId:o,idleTimeoutSecond:r})}catch(e){console.error(s.red("Error:"),e instanceof Error?e.message:"Unknown error"),process.env.DEBUG&&console.error(e),process.exit(1)}}),wi.command("upgrade-daemon",!1,{},async e=>{const{startUpgradeDaemon:n}=await Promise.resolve().then(function(){return yi});await n(),process.exit(0)}),wi.command("start","Start daemon (if not running) and show status",{},async e=>{try{await bn()}catch(e){console.error(s.red("Error:"),e instanceof Error?e.message:"Authentication failed"),process.env.DEBUG&&console.error(e),process.exit(1)}const n=function(){const e=at(),n=[],t=e.cli.find(e=>"git"===e.name);t&&!t.installed&&n.push("git");for(const t of e.missingSandbox)n.push(t.name);return{ok:0===n.length,missing:n}}();if(n.ok||(console.log(s.bold.red("\n⚠️ Missing Critical Dependencies")),console.log(s.yellow(`Cannot start daemon. Missing: ${n.missing.join(", ")}`)),console.log(s.blue('\nRun "agentrix doctor" for detailed dependency information and installation instructions.')),process.exit(1)),!await gn()){console.log("Starting Agentrix background service..."),Dt(["daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref();let e=!1;for(let n=0;n<50;n++)if(await new Promise(e=>setTimeout(e,100)),await mn()){e=!0;break}e?(await new Promise(e=>setTimeout(e,1200)),await mn()?console.log(s.green("✓ Daemon started successfully")):await async function(){const e=await async function(){const e=ve(N.getStatePaths().logsDir,"daemon.log");try{return(await an(e,"utf8")).trim().split("\n").filter(Boolean).slice(-12).join("\n")||null}catch{return null}}();if(console.log(s.red("✗ Daemon exited shortly after startup")),!e)return;const n=e.split("\n").reverse().find(e=>e.includes("Machine binding revoked")||e.includes("Run `agentrix logout` and bind again"));n?console.log(s.yellow(n)):(console.log(s.gray("Recent daemon log:")),console.log(e))}()):console.log(s.yellow("⚠️ Daemon may still be starting..."))}if(ri()){const e=await oi();e.hasUpgrade&&(t=e).hasUpgrade&&t.latestVersion&&(console.log(""),console.log(s.yellow("┌────────────────────────────────────────────────────┐")),console.log(s.yellow("│")+" "+s.bold("Upgrade Available")+" "+s.yellow("│")),console.log(s.yellow("│")+" "+s.yellow("│")),console.log(s.yellow("│")+` Current: ${s.dim(t.currentVersion)} → Latest: ${s.green.bold(t.latestVersion)} `+s.yellow("│")),console.log(s.yellow("│")+" "+s.yellow("│")),console.log(s.yellow("│")+" Run "+s.cyan.bold("agentrix upgrade")+" to upgrade "+s.yellow("│")),console.log(s.yellow("│")+" "+s.yellow("│")),console.log(s.yellow("│")+" To enable auto-upgrade, set: "+s.yellow("│")),console.log(s.yellow("│")+" "+s.dim("AGENTRIX_DISABLE_AUTO_UPGRADE=false")+" "+s.yellow("│")),console.log(s.yellow("└────────────────────────────────────────────────────┘")),console.log(""))}else xi()||Dt(["upgrade-daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref();var t;await it("daemon"),process.exit(0)}),wi.demandCommand(1,"Please specify a command. Use --help to see available commands.").parse();
|
|
1
|
+
import{createRequire as e}from"node:module";const n=e(import.meta.url);import t,{tmpdir as s,homedir as a}from"node:os";import*as i from"node:fs";import o,{existsSync as r,readFileSync as c,statSync as p,writeFileSync as l,renameSync as d,rmSync as u,readdirSync as m,mkdirSync as g,createWriteStream as h,unlinkSync as f}from"node:fs";import*as x from"node:path";import v,{join as b,dirname as y,basename as w,relative as k,normalize as I,extname as S,isAbsolute as T,resolve as E}from"node:path";import C from"yargs";import{hideBin as A}from"yargs/helpers";import M from"chalk";import{encodeBase64 as _,createKeyPairWithUit8Array as P,encryptMachineEncryptionKey as R,generateAESKey as $,decodeBase64 as D,decryptWithEphemeralKey as O,createEventId as N,encryptFileContent as j,splitRtcChunkFrame as q,RtcChunkFlags as U,buildRtcChunkFrame as G,decryptSdkMessage as L,machineAuth as W,encryptSdkMessage as H,isSDKUserMessage as F,isAskUserMessage as z,isAskUserResponseMessage as B,isSDKMessage as K,decodeGitPath as V,getAgentContext as X,detectPreview as Y,IGNORED_DIRECTORIES as J,isCompanionHeartbeatMessage as Q,isCompanionReminderMessage as Z,workerAuth as ee}from"@agentrix/shared";import{randomBytes as ne,createDecipheriv as te,randomUUID as se,createHash as ae}from"node:crypto";import ie from"axios";import{m as oe,l as re,p as ce,a as pe,c as le,g as de,b as ue}from"./logger-gqEfOYLW.mjs";import{createInterface as me}from"node:readline";import*as ge from"fs";import he,{readFileSync as fe,existsSync as xe,promises as ve}from"fs";import*as be from"path";import ye,{join as we,dirname as ke}from"path";import Ie from"open";import{io as Se}from"socket.io-client";import{EventEmitter as Te}from"node:events";import{createRequire as Ee}from"node:module";import{spawn as Ce,execSync as Ae}from"child_process";import Me from"ps-list";import _e from"cross-spawn";import{getPlatform as Pe}from"@xmz-ai/sandbox-runtime/dist/utils/platform.js";import Re from"fastify";import{z as $e,toJSONSchema as De}from"zod";import{validatorCompiler as Oe,serializerCompiler as Ne}from"fastify-type-provider-zod";import{spawnSync as je,execSync as qe,execFile as Ue}from"node:child_process";import{EventEmitter as Ge}from"events";import Le from"better-sqlite3";import{fileURLToPath as We,pathToFileURL as He}from"url";import{isSupportedPlatform as Fe,NetworkManager as ze,SandboxManager as Be}from"@xmz-ai/sandbox-runtime";import{pipeline as Ke}from"node:stream/promises";import{tool as Ve,createSdkMcpServer as Xe,query as Ye,AbortError as Je}from"@anthropic-ai/claude-agent-sdk";import Qe from"simple-git";import{promisify as Ze}from"node:util";import{mkdir as en,writeFile as nn,readFile as tn}from"node:fs/promises";import{randomUUID as sn}from"crypto";import{replacePromptPlaceholders as an,loadAgentConfig as on,getAgentContext as rn}from"@agentrix/shared/node";import{Codex as cn}from"@openai/codex-sdk";import"winston";import"os";const pn=new Set(["AGENTRIX_CLAUDE_HOME","AGENTRIX_CODEX_HOME","AGENTRIX_CLAUDE_PATH","AGENTRIX_CODEX_PATH"]);function ln(e){return e.replace(/^~(?=\/|$)/,t.homedir())}function dn(e,n,t){const s=n.toLowerCase();"http_proxy"===s?(e.HTTP_PROXY=t,e.http_proxy=t):"https_proxy"===s?(e.HTTPS_PROXY=t,e.https_proxy=t):"no_proxy"===s?(e.NO_PROXY=t,e.no_proxy=t):"all_proxy"===s?(e.ALL_PROXY=t,e.all_proxy=t):"global_agent_http_proxy"===s&&(e.GLOBAL_AGENT_HTTP_PROXY=t,e.global_agent_http_proxy=t)}function un(e,n,t){const s=t.trim();s&&("AGENTRIX_CLAUDE_HOME"===n?e.CLAUDE_CONFIG_DIR=ln(s):"AGENTRIX_CODEX_HOME"===n&&(e.CODEX_HOME=ln(s)))}async function mn(e){return new Promise(n=>setTimeout(n,e))}async function gn(e,n){const t=await oe.readDaemonState();if(!t?.port){const e="No daemon running, no state file found";return re.debug(`[CONTROL CLIENT] ${e}`),{error:e}}try{const s=process.env.AGENTRIX_DAEMON_HTTP_TIMEOUT?parseInt(process.env.AGENTRIX_DAEMON_HTTP_TIMEOUT):1e4,a=await fetch(`http://agentrix-local.xmz.ai:${t.port}${e}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n||{}),signal:AbortSignal.timeout(s)});if(!a.ok){const n=`Request failed: ${e}, HTTP ${a.status}`;return re.debug(`[CONTROL CLIENT] ${n}`),{error:n}}return await a.json()}catch(n){const t=`Request failed: ${e}, ${n instanceof Error?n.message:"Unknown error"}`;return re.debug(`[CONTROL CLIENT] ${t}`),{error:t}}}async function hn(e,n){return await gn("/session-started",{sessionId:e,metadata:n})}async function fn(){const e=await oe.readDaemonState();if(!e)return!1;try{return process.kill(e.pid,0),!0}catch{return re.debug("[DAEMON RUN] Daemon PID not running, cleaning up state"),await vn(),!1}}async function xn(){if(re.debug("[DAEMON CONTROL] Checking if daemon is running same version"),!await fn())return re.debug("[DAEMON CONTROL] No daemon running, returning false"),!1;const e=await oe.readDaemonState();if(!e)return re.debug("[DAEMON CONTROL] No daemon state found, returning false"),!1;try{const n=we(ce(),"package.json"),t=JSON.parse(fe(n,"utf-8")).version;return re.debug(`[DAEMON CONTROL] Current CLI version: ${t}, Daemon started with version: ${e.cliVersion}`),t===e.cliVersion}catch(e){return re.debug("[DAEMON CONTROL] Error checking daemon version",e),!1}}async function vn(){try{await oe.clearDaemonState(),re.debug("[DAEMON RUN] Daemon state file removed")}catch(e){re.debug("[DAEMON RUN] Error cleaning up daemon metadata",e)}}async function bn(){try{const e=await oe.readDaemonState();if(!e)return void re.debug("No daemon state found");re.debug(`Stopping daemon with PID ${e.pid}`);try{return await async function(){await gn("/stop")}(),void await async function(e){const n=Date.now();for(;Date.now()-n<2e3;)try{process.kill(e,0),await new Promise(e=>setTimeout(e,100))}catch{return}throw new Error("Process did not die within timeout")}(e.pid)}catch(e){re.debug("HTTP stop failed, will force kill",e)}process.kill(e.pid,"SIGKILL")}catch(e){re.debug("Error stopping daemon",e)}}function yn(e){return`${e}\nRun \`agentrix logout\` and bind this machine again.`}function wn(e,n){if(ie.isAxiosError(e)){const t=e.response?.data?.message;return"string"==typeof t&&t.length>0?t.includes("Machine binding revoked")?yn(t):`${n}: ${t}`:"string"==typeof e.message&&e.message.includes("Machine binding revoked")?yn(e.message):`${n}: ${e.message}`}return e instanceof Error&&e.message.includes("Machine binding revoked")?yn(e.message):e instanceof Error?`${n}: ${e.message}`:n}async function kn(){const e=await oe.readCredentials();if(e)return await async function(e){try{await ie.get(`${oe.serverUrl}/v1/machines/validate`,{headers:{Authorization:`Bearer ${e.token}`},timeout:15e3})}catch(e){throw new Error(wn(e,"Stored machine credentials are no longer valid"))}}(e),re.info("[AUTH] Using existing credentials"),e;const n=process.env.CLOUD_AUTH_TOKEN,t=process.env.CLOUD_DEVICE;let s,a,i;if(n&&t)s={token:n,machineId:t},re.info("[AUTH] Cloud mode detected, using CLOUD_AUTH_TOKEN");else{const e=await async function(){console.clear();const e=oe.generateMachineId(),n=new Uint8Array(ne(32)),t=await P(n);try{console.log(`[AUTH] Sending auth request to: ${oe.serverUrl}/v1/auth/machine`),console.log(`[AUTH] Public key: ${_(t.publicKey).substring(0,20)}...`);const n={machineId:e};await ie.post(`${oe.serverUrl}/v1/auth/machine`,n),console.log("[AUTH] Auth request sent successfully")}catch(e){return console.log(wn(e,"Failed to create authentication request, please try again later.")),{credentials:null,userPublicKey:null,keypair:t}}const s=await async function(e,n){console.clear(),console.log("\nWeb Authentication\n");const t=function(e,n){const t={key:_(e,"base64"),machineId:n},s=JSON.stringify(t),a=_((new TextEncoder).encode(s),"base64url");return`${oe.webappUrl}/terminal/connect?auth=${a}`}(e.publicKey,n);return console.log("Opening your browser..."),await async function(e){try{return!process.stdout.isTTY||process.env.CI||process.env.HEADLESS?(re.debug("[browser] Headless environment detected, skipping browser open"),!1):(re.debug(`[browser] Attempting to open URL: ${e}`),await Ie(e),re.debug("[browser] Browser opened successfully"),!0)}catch(e){return re.debug("[browser] Failed to open browser:",e),!1}}(t)?(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(t),console.log(""),await async function(e,n){process.stdout.write("Waiting for authentication");let t=0,s=!1;const a=()=>{s=!0,console.log("\n\nAuthentication cancelled."),process.exit(0)};process.on("SIGINT",a);try{for(;!s;){try{const t=await ie.get(`${oe.serverUrl}/v1/auth/machine?machineId=${n}`);if("authorized"===t.data.state){const n=t.data.token,s=t.data.content,a=O(D(s),e.secretKey);return a?{token:n,userPublicKey:JSON.parse((new TextDecoder).decode(a)).publicKey}:(console.log("\n\nFailed to decrypt authentication data. Please try again."),{token:null,userPublicKey:null})}}catch(e){return console.log(`\n\n${wn(e,"Failed to check authentication status. Please try again.")}`),{token:null,userPublicKey:null}}process.stdout.write("\rWaiting for authentication"+".".repeat(t%3+1)+" "),t++,await mn(1e3)}}finally{process.off("SIGINT",a)}return{token:null,userPublicKey:null}}(e,n)}(t,e);return s.token?{credentials:{token:s.token,secret:_(n),machineId:e},userPublicKey:s?.userPublicKey,keypair:t}:{credentials:null,userPublicKey:null,keypair:t}}();if(!e.credentials||!e.userPublicKey)throw new Error("Authentication failed or was cancelled");s=e.credentials,a=e.keypair,i=e.userPublicKey}return await oe.writeCredentials(s),await async function(e,n,t,s){try{const a={id:e.machineId,metadata:JSON.stringify(n)};s&&t&&(a.dataEncryptionKey=R(s.publicKey,$(),D(t))),await ie.post(`${oe.serverUrl}/v1/machines/sync`,a,{headers:{Authorization:`Bearer ${e.token}`,"Content-Type":"application/json"},timeout:6e4})}catch(e){throw new Error(wn(e,"Failed to sync machine data"))}}(s,oe.metadata(),i,a),re.info("[AUTH] Machine setup completed"),s}!function(e=process.env){!function(e=process.env,n){if(!n?.variables)return e;const t=!0===n.enabled;for(const[s,a]of Object.entries(n.variables)){const n=s.trim();if(!n)continue;const i=String(a),o=pn.has(n);(t||o)&&(e[n]=i,dn(e,n,i),un(e,n,i))}}(e,function(e=process.env){const n=b(function(e=process.env){const n=e.AGENTRIX_HOME_DIR||e.AGENTRIX_DIR;return n?ln(n):b(t.homedir(),".agentrix")}(e),"settings.json");if(!r(n))return null;try{const e=c(n,"utf-8"),t=JSON.parse(e);return t?.daemonEnv||null}catch{return null}}(e))}();class In{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 Sn{socket=null;config;eventHandlers=new Map;eventEmitter=new Te;KeepAliveManager=null;healthCheckInterval=null;constructor(e){this.config=e,e.keepAliveConfig&&(this.KeepAliveManager=new In(e.keepAliveConfig))}connect(){if(this.socket)return void this.log("Already connected or connecting");const{serverUrl:e,path:n,auth:t={},options:s={}}=this.config,a={path:n,auth:t,transports:["websocket"],reconnection:!0,reconnectionDelay:1e3,reconnectionDelayMax:5e3,reconnectionAttempts:1/0,...s};this.socket=Se(e,a),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,n,t){this.socket&&(n&&this.socket.off(e,n),this.socket.on(e,t))}onEvent(e,n){const t=async t=>(this.log(`received event ${e}, data: ${JSON.stringify(t)}`),n(t)),s=this.eventHandlers.get(e);this.eventHandlers.set(e,t),this.replaceSocketHandler(e,s,t)}onEventWithAck(e,n){const t=async(t,s)=>(this.log(`received event with ack ${e}, data: ${JSON.stringify(t)}`),n(t,s)),s=this.eventHandlers.get(e);this.eventHandlers.set(e,t),this.replaceSocketHandler(e,s,t)}unregisterHandler(e){this.eventHandlers.delete(e),this.socket&&this.socket.off(e)}send(e,n){this.socket?(this.log(`send event ${e}`),void 0!==n?this.socket.emit(e,n):this.socket.emit(e)):this.log("Cannot send - socket not connected")}async sendWithAck(e,n){if(!this.socket)throw new Error("Cannot send - socket not connected");return this.log(`send event ${e}, data: ${JSON.stringify(n)}`),this.socket.emitWithAck(e,n)}sendVolatile(e,n){this.socket&&(void 0!==n?this.socket.volatile.emit(e,n):this.socket.volatile.emit(e))}async flush(e=1e4){if(this.connected)return new Promise(n=>{const t=setTimeout(()=>n(),e);this.socket.emit("ping",()=>{clearTimeout(t),n()})})}updateAuth(e){this.socket&&(this.socket.auth=e),this.config.auth=e}onLifecycle(e,n){this.eventEmitter.on(`lifecycle:${e}`,n)}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,n]of this.eventHandlers.entries())this.socket.off(e,n),this.socket.on(e,n);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:",function(e){if(!e||"object"!=typeof e)return String(e??"unknown error");const n=e,t=[];return n.message&&t.push(n.message),n.type&&t.push(`type=${n.type}`),void 0!==n.description&&t.push(`description=${JSON.stringify(n.description)}`),void 0!==n.data&&t.push(`data=${JSON.stringify(n.data)}`),void 0!==n.context&&t.push(`context=${JSON.stringify(n.context)}`),t.filter(Boolean).join(" ")||"unknown socket error"}(e)),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 n=e?.intervalMs??3e4,t=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())},t);this.socket.once("pong",()=>{clearTimeout(e)}),this.socket.emit("ping")},n)}stopHealthCheck(){this.healthCheckInterval&&(clearInterval(this.healthCheckInterval),this.healthCheckInterval=null)}log(e,...n){this.config.logger&&this.config.logger(`[SocketClient] ${e}`,...n)}}function Tn(e){if(Object.prototype.hasOwnProperty.call(e,"__esModule"))return e;var n=e.default;if("function"==typeof n){var t=function e(){var t=!1;try{t=this instanceof e}catch{}return t?Reflect.construct(n,arguments,this.constructor):n.apply(this,arguments)};t.prototype=n.prototype}else t={};return Object.defineProperty(t,"__esModule",{value:!0}),Object.keys(e).forEach(function(n){var s=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,s.get?s:{enumerable:!0,get:function(){return e[n]}})}),t}var En,Cn,An,Mn,_n,Pn={},Rn={"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 $n(){if(Mn)return An;Mn=1;var e={"prs.":100,"x-":200,"x.":300,"vnd.":400,default:900},n={nginx:10,apache:20,iana:40,default:30},t={application:1,font:2,audio:2,video:3,default:0};return An=function(s,a="default"){if("application/octet-stream"===s)return 0;const[i,o]=s.split("/"),r=o.replace(/(\.|x-).*/,"$1");return(e[r]||e.default)+(n[a]||n.default)+(t[i]||t.default)+(1-s.length/100)}}var Dn=(_n||(_n=1,function(e){var n,t,s=Cn?En:(Cn=1,En=Rn),a=ye.extname,i=$n(),o=/^\s*([^;\s]*)(?:;|\s|$)/,r=/^text\//i;function c(e){if(!e||"string"!=typeof e)return!1;var n=o.exec(e),t=n&&s[n[1].toLowerCase()];return t&&t.charset?t.charset:!(!n||!r.test(n[1]))&&"UTF-8"}function p(n){if(!n||"string"!=typeof n)return!1;var t=o.exec(n),s=t&&e.extensions[t[1].toLowerCase()];return!(!s||!s.length)&&s[0]}function l(e,n,t){return(n?i(n,s[n].source):0)>(t?i(t,s[t].source):0)?n:t}function d(n,t,a){var i=["nginx","apache",void 0,"iana"],o=t?i.indexOf(s[t].source):0,r=a?i.indexOf(s[a].source):0;return"application/octet-stream"!==e.types[p]&&(o>r||o===r&&"application/"===e.types[p]?.slice(0,12))||o>r?t:a}e.charset=c,e.charsets={lookup:c},e.contentType=function(n){if(!n||"string"!=typeof n)return!1;var t=-1===n.indexOf("/")?e.lookup(n):n;if(!t)return!1;if(-1===t.indexOf("charset")){var s=e.charset(t);s&&(t+="; charset="+s.toLowerCase())}return t},e.extension=p,e.extensions=Object.create(null),e.lookup=function(n){if(!n||"string"!=typeof n)return!1;var t=a("x."+n).toLowerCase().slice(1);return t&&e.types[t]||!1},e.types=Object.create(null),e._extensionConflicts=[],n=e.extensions,t=e.types,Object.keys(s).forEach(function(a){var i=s[a].extensions;if(i&&i.length){n[a]=i;for(var o=0;o<i.length;o++){var r=i[o];t[r]=l(0,t[r],a);const n=d(0,t[r],a);n!==t[r]&&e._extensionConflicts.push([r,n,t[r]])}}})}(Pn)),Pn);function On(e,n){e?e.send("workspace-file-response",n):re.error("[WORKSPACE] Cannot send workspace-file-response: client not available")}function Nn(e,n,t,s){return{eventId:N(),requestId:e,taskId:n,success:!1,error:{code:t,message:s}}}function jn(e){return async n=>{const{taskId:t,userId:s,relativePath:a,requestId:o,maxFileSizeMB:r,ifModifiedSince:c,dataEncryptionKey:p}=n;re.debug(`[WORKSPACE] File request: taskId=${t}, userId=${s}, relativePath=${a}, maxFileSizeMB=${r}, ifModifiedSince=${c}, hasEncryptionKey=${!!p}`);try{const n=1024*(r||10)*1024,l=function(e,n,t){return oe.resolveWorkspaceFilePath(e,n,t)}(s,t,a);if(!i.existsSync(l))return re.warn(`[WORKSPACE] File not found: ${l}`),void On(e.client,Nn(o,t,"file_not_found","File or directory not found"));const d=await i.promises.stat(l),u=d.mtime.toISOString();if(c&&u===c)return void function(e,n,t,s){re.debug(`[WORKSPACE] File not modified: ${s}`),On(e,{eventId:N(),requestId:n,taskId:t,success:!0,notModified:!0})}(e.client,o,t,l);if(d.isDirectory())return void await async function(e,n,t,s,a,o){const r=await i.promises.readdir(s,{withFileTypes:!0}),c=await Promise.all(r.map(async e=>{const n=x.join(s,e.name),t=await i.promises.stat(n);return{name:e.name,type:e.isDirectory()?"directory":"file",size:t.size,modifiedAt:t.mtime.toISOString(),accessDenied:t.size>o}}));On(e,{eventId:N(),requestId:n,taskId:t,success:!0,data:{type:"directory",entries:c,metadata:{size:0,modifiedAt:a.mtime.toISOString()}}})}(e.client,o,t,l,d,n);{const s=Dn.lookup(l)||"application/octet-stream";return d.size>n?void function(e,n,t,s,a,i,o){re.warn(`[WORKSPACE] File too large (${a.size} bytes > ${o} bytes): ${s}`),On(e,{eventId:N(),requestId:n,taskId:t,success:!0,data:{type:"file",metadata:{size:a.size,mimeType:i,modifiedAt:a.mtime.toISOString(),accessDenied:!0}}})}(e.client,o,t,l,d,s,n):void await async function(e,n,t,s,a,o){const r=Dn.lookup(s)||"application/octet-stream",c=(await i.promises.readFile(s)).toString("base64");let p=null;o&&(p=await async function(e){try{const n=await oe.getSecretKey();if(!n)return re.warn("[WORKSPACE] Machine secret key not available"),null;const t=D(e);return O(t,n)||(re.warn("[WORKSPACE] Failed to decrypt dataEncryptionKey"),null)}catch(e){return re.warn("[WORKSPACE] Error decrypting dataEncryptionKey:",e),null}}(o));const l={type:"file",metadata:{size:a.size,mimeType:r,modifiedAt:a.mtime.toISOString()}};p?l.encryptedContent=j(c,p):l.content=c,On(e,{eventId:N(),requestId:n,taskId:t,success:!0,data:l})}(e.client,o,t,l,d,p)}}catch(n){re.error(`[WORKSPACE] Failed to handle workspace-file-request: ${n.message}`,n);const s="ENOENT"===n.code?"file_not_found":"EACCES"===n.code?"permission_denied":"unknown_error";On(e.client,Nn(o,t,s,n.message))}}}const qn=b(oe.agentrixHomeDir,"credentials");function Un(e,n){const t=function(e){return b(qn,`${e}.pat.enc`)}(e);if(!r(t))return null;try{const e=c(t,"utf8"),{iv:s,authTag:a,encrypted:i}=JSON.parse(e),o=n.slice(0,32),r=te("aes-256-gcm",o,Buffer.from(s,"hex"));r.setAuthTag(Buffer.from(a,"hex"));let p=r.update(i,"hex","utf8");return p+=r.final("utf8"),p}catch{return null}}const Gn=100,Ln=[{method:"GET",pattern:/^\/user$/},{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\/[^/]+\/issues\/\d+\/notes$/},{method:"GET",pattern:/^\/projects\/[^/]+\/issues\/\d+\/discussions$/},{method:"POST",pattern:/^\/projects\/[^/]+\/issues\/\d+\/discussions$/},{method:"POST",pattern:/^\/projects\/[^/]+\/issues\/\d+\/discussions\/[^/]+\/notes$/},{method:"GET",pattern:/^\/projects\/[^/]+\/merge_requests$/},{method:"GET",pattern:/^\/projects\/[^/]+\/merge_requests\/\d+$/},{method:"GET",pattern:/^\/projects\/[^/]+\/merge_requests\/\d+\/changes$/},{method:"GET",pattern:/^\/projects\/[^/]+\/merge_requests\/\d+\/notes$/},{method:"GET",pattern:/^\/projects\/[^/]+\/merge_requests\/\d+\/discussions$/},{method:"GET",pattern:/^\/projects\/[^/]+\/merge_requests\/\d+\/approvals$/},{method:"POST",pattern:/^\/projects\/[^/]+\/merge_requests\/\d+\/discussions$/},{method:"POST",pattern:/^\/projects\/[^/]+\/merge_requests\/\d+\/discussions\/[^/]+\/notes$/},{method:"POST",pattern:/^\/projects\/[^/]+\/merge_requests\/\d+\/approve$/},{method:"POST",pattern:/^\/projects\/[^/]+\/merge_requests$/},{method:"PUT",pattern:/^\/projects\/[^/]+\/merge_requests\/\d+$/},{method:"PUT",pattern:/^\/projects\/[^/]+\/merge_requests\/\d+\/discussions\/[^/]+$/},{method:"PUT",pattern:/^\/projects\/[^/]+\/merge_requests\/\d+\/discussions\/[^/]+\/notes\/\d+$/},{method:"PUT",pattern:/^\/projects\/[^/]+\/merge_requests\/\d+\/merge$/}];class Wn{apiUrl;pat;requestId;gitServerId;constructor(e,n,t){this.apiUrl=e,this.pat=n,this.requestId=t?.requestId,this.gitServerId=t?.gitServerId}logPrefix(){return`[GITLAB EXECUTOR] reqId=${this.requestId??"-"}, gitServer=${this.gitServerId??"-"}`}summarizeResult(e,n){if(Array.isArray(n))return`items=${n.length}`;if(n&&"object"==typeof n){const t=n;return"resolveGitAuthContext"===e?`authMode=${String(t.authMode??"unknown")}, hasPat=${Boolean(t.hasPat)}`:"number"in t||"state"in t?`number=${String(t.number??"-")}, state=${String(t.state??"-")}`:`keys=${Object.keys(t).join(",")||"-"}`}return"type="+typeof n}truncateText(e,n=300){return e.length<=n?e:`${e.slice(0,n)}...`}async requestWithResponse(e,n="GET",t){const s=`${this.apiUrl}${e}`,a={Authorization:`Bearer ${this.pat}`,"Content-Type":"application/json"},i=Date.now();re.debug(`${this.logPrefix()} request start: ${n} ${e}`);try{const o=await fetch(s,{method:n,headers:a,body:t?JSON.stringify(t):void 0}),r=Date.now()-i;if(!o.ok){const t=await o.text().catch(()=>"Unknown error"),s=this.truncateText(t);throw re.warn(`${this.logPrefix()} request failed: ${n} ${e}, status=${o.status}, elapsedMs=${r}, detail=${s}`),{status:o.status,message:`GitLab API error: ${o.status} ${o.statusText}`,detail:s}}return re.debug(`${this.logPrefix()} request success: ${n} ${e}, elapsedMs=${r}`),{data:await o.json(),headers:o.headers}}catch(t){if("object"==typeof t&&null!==t&&"status"in t)throw t;const s=t instanceof Error?t.message:"Unknown network error";throw re.error(`${this.logPrefix()} request exception: ${n} ${e}, message=${s}`),{status:0,message:`GitLab request failed: ${s}`}}}async request(e,n="GET",t){const{data:s}=await this.requestWithResponse(e,n,t);return s}withQueryParams(e,n){const[t,s=""]=e.split("?"),a=new URLSearchParams(s);for(const[e,t]of Object.entries(n))a.set(e,String(t));const i=a.toString();return i?`${t}?${i}`:t}parseTotalPages(e){const n=e.get("x-total-pages");if(!n)return null;const t=Number.parseInt(n,10);return!Number.isFinite(t)||t<=0?null:t}async fetchRemainingPagesInBatches(e,n){const t=[];for(let s=2;s<=e;s+=4){const a=Math.min(s+4-1,e),i=Array.from({length:a-s+1},(e,n)=>s+n),o=await Promise.all(i.map(e=>n(e)));for(const e of o)t.push(...e)}return t}async requestPaginated(e){const n=this.withQueryParams(e,{per_page:Gn,page:1}),t=await this.requestWithResponse(n),s=[...t.data],a=this.parseTotalPages(t.headers);if(a&&a>1){const n=await this.fetchRemainingPagesInBatches(a,async n=>{const t=this.withQueryParams(e,{per_page:Gn,page:n});return this.request(t)});return s.push(...n),s}if(!a&&t.data.length===Gn){let n=2;for(;;){const t=this.withQueryParams(e,{per_page:Gn,page:n}),a=await this.request(t);if(0===a.length)break;if(s.push(...a),a.length<Gn)break;n+=1}}return s}async executeOperation(e,n){re.info(`${this.logPrefix()} execute operation: op=${e}, payloadKeys=${Object.keys(n||{}).join(",")||"-"}`);try{let t;switch(e){case"listRepos":t=await this.listRepos();break;case"listBranches":t=await this.listBranches(n.owner,n.name);break;case"createMergeRequest":t=await this.createMergeRequest(n);break;case"getMergeRequest":t=await this.getMergeRequest(n.owner,n.name,n.iid);break;case"listMergeRequests":t=await this.listMergeRequests(n.owner,n.name);break;case"requestGitlabApi":t=await this.requestGitlabApi(n);break;case"resolveGitAuthContext":t={authMode:"local_pat",hasPat:!0};break;default:throw{status:400,message:`Unknown operation: ${e}`}}return re.info(`${this.logPrefix()} operation success: op=${e}, summary=${this.summarizeResult(e,t)}`),t}catch(n){const t=n instanceof Error?n.message:"object"==typeof n&&null!==n&&"message"in n?String(n.message):"Unknown error";throw re.error(`${this.logPrefix()} operation failed: op=${e}, message=${t}`),n}}async listRepos(){return(await this.requestPaginated("/projects?membership=true&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,n){const t=encodeURIComponent(`${e}/${n}`);return(await this.requestPaginated(`/projects/${t}/repository/branches`)).map(e=>({name:e.name,commit:{sha:e.commit.id,url:""},protected:e.protected}))}async createMergeRequest(e){const n=encodeURIComponent(`${e.owner}/${e.repo}`),t=await this.request(`/projects/${n}/merge_requests`,"POST",{source_branch:e.head,target_branch:e.base,title:e.title,description:e.body||""});return{number:t.iid,title:t.title,body:t.description,state:"opened"===t.state?"open":t.state,url:t.web_url,head:t.source_branch,base:t.target_branch,createdAt:t.created_at,updatedAt:t.updated_at}}async getMergeRequest(e,n,t){const s=encodeURIComponent(`${e}/${n}`),a=await this.request(`/projects/${s}/merge_requests/${t}`);return{number:a.iid,title:a.title,body:a.description,state:"opened"===a.state?"open":a.state,url:a.web_url,head:a.source_branch,base:a.target_branch,createdAt:a.created_at,updatedAt:a.updated_at}}async listMergeRequests(e,n){const t=encodeURIComponent(`${e}/${n}`);return(await this.request(`/projects/${t}/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 n="string"==typeof e?e.toUpperCase():"GET";if("GET"===n||"POST"===n||"PUT"===n||"PATCH"===n||"DELETE"===n)return n;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 n=new URLSearchParams;for(const[t,s]of Object.entries(e))if(null!=s)if(Array.isArray(s))for(const e of s){if("string"!=typeof e&&"number"!=typeof e&&"boolean"!=typeof e)throw{status:400,message:`Proxy query value for "${t}" is invalid`};n.append(t,String(e))}else{if("string"!=typeof s&&"number"!=typeof s&&"boolean"!=typeof s)throw{status:400,message:`Proxy query value for "${t}" is invalid`};n.append(t,String(s))}return n.toString()}isProxyAllowed(e,n){return Ln.some(t=>t.method===e&&t.pattern.test(n))}async requestGitlabApi(e){const n=this.parseProxyMethod(e.method),t=this.parseProxyPath(e.path),s=this.buildProxyQueryString(e.query),a=s.length>0?`${t}?${s}`:t;if(!this.isProxyAllowed(n,t))throw{status:403,message:`Proxy path not allowed: ${n} ${t}`};return"GET"===n?await this.request(a,n):await this.request(a,n,e.body)}}function Hn(e){return async(n,t)=>{re.info(`[EVENT HANDLER] create-task: ${n.taskId}, agentType=${n.agentType}, agentId=${n.agentId}`),"task-message"===n.event?await e.workerManager.startWorker(n,"create-task"):re.error(`[EVENT HANDLER] create-task expects task-message, got ${n.event} for task ${n.taskId}`)}}function Fn(e){return async(n,t)=>{re.debug(`[EVENT HANDLER] resume-task: ${n.taskId}, agentSessionId=${n.agentSessionId}`),await e.workerManager.startWorker(n,"resume-task")}}function zn(e){return async n=>{re.info("[EVENT HANDLER] shutdown-machine received",n),e.requestShutdown("agentrix-app",n.reason)}}function Bn(e){return async(n,t)=>{re.info(`[EVENT HANDLER] deploy-agent received: taskId=${n.taskId}, draftAgentId=${n.draftAgentId}, targetAgentId=${n.targetAgentId}, sourcePath=${n.sourcePath}`),await e.workerManager.startDeploymentWorker(n)}}function Kn(e){return async n=>{re.info(`[EVENT HANDLER] stop-task: ${n.taskId}, reason=${n.reason||"n/a"}`),e.workerManager.stopSession(n.taskId)||re.warn(`[EVENT HANDLER] stop-task failed, task not found: ${n.taskId}`)}}function Vn(e){return async n=>{re.info(`[GITLAB PROXY] request received: reqId=${n.requestId}, op=${n.operation}, gitServer=${n.gitServerId}, ttlMs=${n.ttlMs}, payloadKeys=${function(e){const n=Object.keys(e||{});return n.length>0?n.join(","):"-"}(n.payload)}`);const t=Date.now(),s=t=>{const s={eventId:n.requestId,requestId:n.requestId,machineId:e.machineId,...t};e.client?(e.client.send("daemon-gitlab-response",s),re.info(`[GITLAB PROXY] response sent: reqId=${n.requestId}, op=${n.operation}, success=${t.success}, executionMs=${t.executionTimeMs}`)):re.error(`[GITLAB PROXY] response dropped: reqId=${n.requestId}, op=${n.operation}, reason=socket-client-unavailable`)};try{const e=await oe.getSecretKey();if(!e)return re.warn(`[GITLAB PROXY] machine secret key unavailable: reqId=${n.requestId}, op=${n.operation}, gitServer=${n.gitServerId}`),void s({success:!1,errorCode:"PAT_MISSING",errorMessage:"Machine secret key not available",executionTimeMs:Date.now()-t});const a=Un(n.gitServerId,e);if(!a)return re.warn(`[GITLAB PROXY] PAT missing: reqId=${n.requestId}, op=${n.operation}, gitServer=${n.gitServerId}`),void s({success:!1,errorCode:"PAT_MISSING",errorMessage:`No PAT configured for git server ${n.gitServerId}`,executionTimeMs:Date.now()-t});const i=n.payload.apiUrl;if(!i)return re.warn(`[GITLAB PROXY] apiUrl missing in payload: reqId=${n.requestId}, op=${n.operation}, gitServer=${n.gitServerId}`),void s({success:!1,errorCode:"PAT_MISSING",errorMessage:"GitLab API URL not provided in request",executionTimeMs:Date.now()-t});re.info(`[GITLAB PROXY] executing: reqId=${n.requestId}, op=${n.operation}, gitServer=${n.gitServerId}, apiHost=${function(e){try{return new URL(e).host}catch{return"invalid-url"}}(i)}`);const o=new Wn(i,a,{requestId:n.requestId,gitServerId:n.gitServerId}),r=await o.executeOperation(n.operation,n.payload);re.info(`[GITLAB PROXY] execution succeeded: reqId=${n.requestId}, op=${n.operation}, summary=${function(e,n){if(Array.isArray(n))return`items=${n.length}`;if(n&&"object"==typeof n){const t=n;return"resolveGitAuthContext"===e?`authMode=${String(t.authMode??"unknown")}, hasPat=${Boolean(t.hasPat)}`:"number"in t||"state"in t?`number=${String(t.number??"-")}, state=${String(t.state??"-")}`:`keys=${Object.keys(t).join(",")||"-"}`}return"type="+typeof n}(n.operation,r)}`),s({success:!0,data:r,executionTimeMs:Date.now()-t})}catch(e){const a=e;let i="GITLAB_CONNECTIVITY_FAILED";401===a.status?i="PAT_INVALID":403===a.status?i="PAT_SCOPE_INSUFFICIENT":404===a.status&&(i="RESOURCE_NOT_FOUND");const o="string"==typeof a.message?a.message:"Unknown error",r="string"==typeof a.detail?function(e,n=300){return e.length<=n?e:`${e.slice(0,n)}...`}(a.detail):void 0,c="number"==typeof a.status?String(a.status):"unknown";re.error(`[GITLAB PROXY] execution failed: reqId=${n.requestId}, op=${n.operation}, errorCode=${i}, status=${c}, message=${o}${r?`, detail=${r}`:""}`),s({success:!1,errorCode:i,errorMessage:o,executionTimeMs:Date.now()-t})}}}const Xn=parseInt(process.env.MAX_WORKSPACE_FILE_SIZE_MB||"100",10);function Yn(e,n){if(!e)return;if("string"==typeof n)return void(e.sendMessage?e.sendMessage(n):e.send&&e.send(n));const t=Buffer.from(n);e.sendMessageBinary?e.sendMessageBinary(t):e.send&&e.send(t)}class Jn{client;machineId;iceServers=[];sessions=new Map;rtcModule;peerConstructor;constructor(e,n){this.client=e,this.machineId=n;const t=Ee(import.meta.url);var s;this.rtcModule=t("node-datachannel"),this.peerConstructor=(s=this.rtcModule).RTCPeerConnection||s.PeerConnection||s.RTCConnection||s.PeerConnection,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))):re.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:N()})}handleIceServersResponse(e){this.iceServers=function(e){const n=[];return e.forEach(e=>{Array.isArray(e.urls)?n.push(...e.urls):n.push(e.urls)}),n}(e.iceServers),re.info(`[RTC] Loaded ${this.iceServers.length} ICE servers`)}handleRtcRequest(e){if(!this.peerConstructor)return;const n=e.userId;if(!n)return void re.warn("[RTC] machine-rtc-request missing userId");const t=e.workspaceUserId||n,s=e.taskId;if(this.sessions.has(e.sessionId))return void this.sendMachineRtcResponse(e.sessionId,n,!0);const a=new this.peerConstructor(e.sessionId,{iceServers:this.iceServers}),i={sessionId:e.sessionId,userId:n,workspaceUserId:t,allowedTaskId:s||void 0,peerConnection:a,lastActivity:Date.now(),remoteDescriptionSet:!1,pendingCandidates:[]};this.sessions.set(e.sessionId,i),this.registerPeerHandlers(i),this.sendMachineRtcResponse(e.sessionId,n,!0)}sendMachineRtcResponse(e,n,t,s){this.client.send("machine-rtc-response",{eventId:N(),machineId:this.machineId,sessionId:e,accepted:t,reason:s,userId:n,capabilities:{dataChannel:!0}})}handleRtcSignal(e){if(!this.peerConstructor)return;if("app"!==e.from)return;const n=e.userId;if(!n)return void re.warn("[RTC] rtc-signal missing userId");const t=e.workspaceUserId||n,s=e.taskId;let a=this.sessions.get(e.sessionId);if(!a){const i=new this.peerConstructor(e.sessionId,{iceServers:this.iceServers});a={sessionId:e.sessionId,userId:n,workspaceUserId:t,allowedTaskId:s||void 0,peerConnection:i,lastActivity:Date.now(),remoteDescriptionSet:!1,pendingCandidates:[]},this.sessions.set(e.sessionId,a),this.registerPeerHandlers(a)}try{this.applyRemoteSignal(a,e.signal)}catch(e){re.warn("[RTC] Failed to apply remote signal",e)}}registerPeerHandlers(e){const{peerConnection:n}=e;n.onStateChange?.(n=>{re.info(`[RTC] Peer state (${e.sessionId}): ${n}`)}),n.onGatheringStateChange?.(n=>{re.info(`[RTC] ICE gathering (${e.sessionId}): ${n}`)}),n.onLocalDescription?.((n,t)=>{const s=function(e,n){return e&&"object"==typeof e&&"string"==typeof e.sdp?{sdp:e.sdp,type:e.type||n}:{sdp:String(e||""),type:n}}(n,t);this.client.send("rtc-signal",{eventId:N(),machineId:this.machineId,sessionId:e.sessionId,from:"machine",signal:s,userId:e.userId})}),n.onLocalCandidate?.((n,t,s)=>{const a=function(e,n,t){return"string"==typeof e?{candidate:e,sdpMid:n||"0",sdpMLineIndex:t??0}:e&&"string"==typeof e.candidate?{candidate:e.candidate,sdpMid:e.sdpMid||e.mid||n||"0",sdpMLineIndex:"number"==typeof e.sdpMLineIndex?e.sdpMLineIndex:t??0}:null}(n,t,s);a&&this.client.send("rtc-signal",{eventId:N(),machineId:this.machineId,sessionId:e.sessionId,from:"machine",signal:{candidate:a},userId:e.userId})}),n.onDataChannel?.(n=>{e.dataChannel=n,this.registerDataChannel(e,n)})}registerDataChannel(e,n){n.onOpen?.(()=>{re.info(`[RTC] Data channel open (${e.sessionId})`),e.lastActivity=Date.now(),Yn(n,JSON.stringify({v:1,type:"control.ready",channel:"control",requestId:`req-${e.sessionId}`,streamId:0,timestamp:(new Date).toISOString(),payload:{ok:!0}}))}),n.onClosed?.(()=>{re.warn(`[RTC] Data channel closed (${e.sessionId})`),e.peerConnection.close?.(),this.sessions.delete(e.sessionId)}),n.onError?.(n=>{re.error(`[RTC] Data channel error (${e.sessionId})`,n)}),n.onMessage?.(n=>{e.lastActivity=Date.now(),this.handleDataChannelMessage(e,n)})}handleDataChannelMessage(e,n){if(Buffer.isBuffer(n)||n instanceof Uint8Array){try{q(new Uint8Array(n))}catch(e){re.warn("[RTC] Received binary payload without handler")}return}let t=null;if("string"==typeof n?t=n:n&&"string"==typeof n.text&&(t=n.text),!t)return;let s=null;try{s=JSON.parse(t)}catch(e){return void re.warn("[RTC] Non-JSON message",t)}s&&"string"==typeof s.type&&"file.request"===s.type&&this.handleFileRequest(e,s).catch(e=>{re.error("[RTC] Failed to handle file request",e)})}async handleFileRequest(e,n){const t=n.payload;if(!t)return;if(t.userId!==e.workspaceUserId)return void this.sendControl(e,{v:1,type:"file.error",channel:"file",requestId:n.requestId,streamId:n.streamId,timestamp:(new Date).toISOString(),error:{code:"unauthorized",message:"Unauthorized workspace access"}});if(e.allowedTaskId&&t.taskId!==e.allowedTaskId)return void this.sendControl(e,{v:1,type:"file.error",channel:"file",requestId:n.requestId,streamId:n.streamId,timestamp:(new Date).toISOString(),error:{code:"unauthorized",message:"Unauthorized task access"}});const s=(a=t.userId,o=t.taskId,r=t.relativePath,oe.resolveWorkspaceFilePath(a,o,r));var a,o,r;if(!i.existsSync(s))return void this.sendControl(e,{v:1,type:"file.error",channel:"file",requestId:n.requestId,streamId:n.streamId,timestamp:(new Date).toISOString(),error:{code:"file_not_found",message:"File or directory not found"}});const c=await i.promises.stat(s);if(!function(e,n){return!n||e.mtime.toISOString()!==n}(c,t.ifModifiedSince))return void this.sendControl(e,{v:1,type:"file.not_modified",channel:"file",requestId:n.requestId,streamId:n.streamId,timestamp:(new Date).toISOString()});if(c.isDirectory()||"directory"===t.entryType){const t=await i.promises.readdir(s,{withFileTypes:!0}),a={entries:await Promise.all(t.map(async e=>{const n=x.join(s,e.name),t=await i.promises.stat(n);return{name:e.name,type:e.isDirectory()?"directory":"file",size:t.size,modifiedAt:t.mtime.toISOString()}})),modifiedAt:c.mtime.toISOString()};return void this.sendControl(e,{v:1,type:"file.dir",channel:"file",requestId:n.requestId,streamId:n.streamId,timestamp:(new Date).toISOString(),payload:a})}const p=1024*(t.maxFileSizeMB??Xn)*1024;if(c.size>p)return void this.sendControl(e,{v:1,type:"file.error",channel:"file",requestId:n.requestId,streamId:n.streamId,timestamp:(new Date).toISOString(),error:{code:"file_too_large",message:"File exceeds size limit"}});const l=Dn.lookup(s)||"application/octet-stream",d={size:c.size,mimeType:"string"==typeof l?l:"application/octet-stream",modifiedAt:c.mtime.toISOString()};this.sendControl(e,{v:1,type:"file.meta",channel:"file",requestId:n.requestId,streamId:n.streamId,timestamp:(new Date).toISOString(),payload:d}),await this.sendFileChunks(e,n.streamId,s),this.sendControl(e,{v:1,type:"file.end",channel:"file",requestId:n.requestId,streamId:n.streamId,timestamp:(new Date).toISOString(),payload:{size:c.size}})}async sendFileChunks(e,n,t){const s=e.dataChannel;if(!s)return;const a=i.createReadStream(t,{highWaterMark:65536});let o=0;await new Promise((e,t)=>{a.on("data",e=>{const t=U.Binary|(0===o?U.Start:0),a=Buffer.isBuffer(e)?e:Buffer.from(e),i=new Uint8Array(a.buffer,a.byteOffset,a.byteLength),r=G({streamId:n,seq:o,flags:t,payloadLength:i.length},i);Yn(s,r),o+=1}),a.on("end",()=>{if(o>0){const e=G({streamId:n,seq:o,flags:U.End|U.Binary,payloadLength:0},new Uint8Array);Yn(s,e)}e()}),a.on("error",e=>t(e))})}sendControl(e,n){const t=e.dataChannel;t&&Yn(t,JSON.stringify(n))}applyRemoteSignal(e,n){const{peerConnection:t}=e;if(n&&n.sdp&&n.type)return t.setRemoteDescription?.(n.sdp,n.type),e.remoteDescriptionSet=!0,e.pendingCandidates?.forEach(e=>{try{t.addRemoteCandidate?.(e.candidate,e.mid)}catch(e){re.warn("[RTC] Failed to add queued candidate",e)}}),void(e.pendingCandidates=[]);if(n&&n.candidate){const s=n.candidate,a="string"==typeof s?s:s&&"string"==typeof s.candidate?s.candidate:null,i=n.sdpMid||s?.sdpMid||s?.mid||"0";if(a){if(!e.remoteDescriptionSet)return void e.pendingCandidates?.push({candidate:a,mid:i});t.addRemoteCandidate?.(a,i)}}}}class Qn{client;context;rtcManager;constructor(e,n,t){const{machineId:s,...a}=e;this.client=new Sn(a),this.context={machineId:s,workerManager:n,requestShutdown:t.requestShutdown,client:this.client},this.rtcManager=new Jn(this.client,s),this.initHandlers(),this.rtcManager.registerHandlers()}connect(){return new Promise((e,n)=>{const t=setTimeout(()=>{n(new Error("Machine connection timeout after 30 seconds"))},3e4);this.client.onLifecycle("connect",()=>{clearTimeout(t),e()}),this.client.onLifecycle("connect_error",e=>{clearTimeout(t),n(e)}),this.client.connect()})}async disconnect(){this.client.connected&&await this.client.flush(5e3).catch(()=>{}),this.rtcManager.shutdown(),this.client.disconnect()}initHandlers(){const e={"create-task":Hn(n=this.context),"resume-task":Fn(n),"stop-task":Kn(n),"deploy-agent":Bn(n),"shutdown-machine":zn(n),"workspace-file-request":jn({client:n.client}),"daemon-gitlab-request":Vn(n)};var n;this.client.onEventWithAck("create-task",e["create-task"]),this.client.onEventWithAck("resume-task",e["resume-task"]),this.client.onEvent("stop-task",e["stop-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 Zn=null;let et=!1;async function nt(){if(et)re.info("[caffeinate] Already stopping, skipping");else if(Zn&&!Zn.killed){et=!0,re.info(`[caffeinate] Stopping caffeinate process PID ${Zn.pid}`);try{Zn.kill("SIGTERM"),await new Promise(e=>setTimeout(e,1e3)),Zn&&!Zn.killed&&Zn.kill("SIGKILL"),Zn=null,et=!1}catch(e){re.info("[caffeinate] Error stopping caffeinate:",e),et=!1}}}let tt=!1;function st(e){const{pid:n,name:t,cmd:s}=e;if(n===process.pid||n===process.ppid)return null;if(!(t.includes("agentrix")||"node"===t&&(s.includes("agentrix-cli")||s.includes("dist/index.mjs")||s.includes("dist\\index.mjs"))||("MainThread"===t||t.includes("MainThread"))&&(s.includes("agentrix-cli")||s.includes("dist/index.mjs")||s.includes("agentrix.mjs"))||s.includes("agentrix.mjs")||s.includes("agentrix-cli")||s.includes("tsx")&&s.includes("src/index.ts")&&s.includes("agentrix-cli")))return null;let a="unknown";const i=s.toLowerCase();return i.includes(" worker")?a="worker":i.includes(" upgrade-daemon")?a="upgrade-daemon":i.includes(" daemon")?a="daemon":i.includes("doctor")&&(a="doctor"),{pid:n,command:s||t,type:a}}async function at(){try{let e;e="win32"===process.platform?await async function(){try{const e=Ae("wmic process where \"name='node.exe'\" get ProcessId,CommandLine /format:csv",{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}),n=[],t=e.split("\n").map(e=>e.trim()).filter(Boolean);for(let e=1;e<t.length;e++){const s=t[e];if(!s)continue;const a=s.indexOf(",");if(-1===a)continue;const i=s.substring(a+1),o=i.lastIndexOf(",");if(-1===o)continue;const r=i.substring(0,o).trim(),c=i.substring(o+1).trim(),p=parseInt(c,10);isNaN(p)||n.push({pid:p,name:"node",cmd:r})}return n}catch(e){return[]}}():(await Me()).map(e=>({pid:e.pid,name:e.name||"",cmd:e.cmd||""}));const n=[];for(const t of e){const e=st(t);e&&n.push(e)}return n}catch(e){return[]}}function it(e){try{const n="win32"===process.platform?"where":"which";return{available:!0,path:Ae(`${n} ${e}`,{encoding:"utf-8",stdio:["pipe","pipe","ignore"]}).trim()}}catch{return{available:!1}}}function ot(){const e=Pe(),n=function(){const e=it("git"),n=it("claude"),t=it("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:n.available,required:!0,description:"Claude Code CLI (required for most features)",installCommand:"npm install -g @anthropic-ai/claude-code",path:n.path},{name:"codex",installed:t.available,required:!1,description:"Codex CLI (optional, for Codex tasks)",installCommand:"npm install -g @codex-ai/codex-cli",path:t.path}]}(),t=function(e){if("macos"===e){const e=it("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=it("bwrap"),n=it("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:n.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:n.path}]}return[]}(e),s=n.filter(e=>e.required&&!e.installed),a=t.filter(e=>e.required&&!e.installed);return{cli:n,sandbox:t,allSatisfied:0===s.length&&0===a.length,missingSandbox:a,missingCli:s}}function rt(){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:oe.agentrixHomeDir,serverUrl:oe.serverUrl,logsDir:oe.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 ct(e){if(e||(e="all"),console.log(M.bold.cyan("\n🩺 Agentrix CLI Doctor\n")),"all"===e){console.log(M.bold("📋 Basic Information")),console.log(`Agentrix CLI Version: ${M.green(pe.version)}`),console.log(`Platform: ${M.green(process.platform)} ${process.arch}`),console.log(`Node.js Version: ${M.green(process.version)}`),console.log(""),console.log(M.bold("🔧 Daemon Spawn Diagnostics"));const e=ce(),n=b(e,"bin","agentrix.mjs"),t=b(e,"dist","index.mjs");console.log(`Project Root: ${M.blue(e)}`),console.log(`Wrapper Script: ${M.blue(n)}`),console.log(`CLI Entrypoint: ${M.blue(t)}`),console.log(`Wrapper Exists: ${r(n)?M.green("✓ Yes"):M.red("❌ No")}`),console.log(`CLI Exists: ${r(t)?M.green("✓ Yes"):M.red("❌ No")}`),console.log(""),console.log(M.bold("⚙️ Configuration")),console.log(`Agentrix Home: ${M.blue(oe.agentrixHomeDir)}`),console.log(`Server URL: ${M.blue(oe.serverUrl)}`),console.log(`Logs Dir: ${M.blue(oe.getStatePaths().logsDir)}`),console.log(M.bold("\n🌍 Environment Variables"));const s=rt();console.log(`AGENTRIX_HOME_DIR: ${s.AGENTRIX_HOME_DIR?M.green(s.AGENTRIX_HOME_DIR):M.gray("not set")}`),console.log(`AGENTRIX_SERVER_URL: ${s.AGENTRIX_SERVER_URL?M.green(s.AGENTRIX_SERVER_URL):M.gray("not set")}`),console.log(`DANGEROUSLY_LOG_TO_SERVER: ${s.DANGEROUSLY_LOG_TO_SERVER_FOR_AI_AUTO_DEBUGGING?M.yellow("ENABLED"):M.gray("not set")}`),console.log(`DEBUG: ${s.DEBUG?M.green(s.DEBUG):M.gray("not set")}`),console.log(`NODE_ENV: ${s.NODE_ENV?M.green(s.NODE_ENV):M.gray("not set")}`),console.log(M.bold("\n🔐 Authentication"));try{await oe.readCredentials()?console.log(M.green("✓ Authenticated (credentials found)")):console.log(M.yellow("⚠️ Not authenticated (no credentials)"))}catch(e){console.log(M.red("❌ Error reading credentials"))}!function(e=!1){const n=ot(),t=Pe();console.log(M.bold("\n🔧 CLI Dependencies"));for(const t of n.cli)if(t.installed)console.log(M.green(`✓ ${t.name}`),M.gray(`- ${t.description}`)),e&&t.path&&console.log(M.gray(` Location: ${t.path}`));else{const e=t.required?M.red("❌"):M.yellow("⚠️");console.log(`${e} ${t.name}`,M.gray(`- ${t.description}`)),t.installCommand&&console.log(M.blue(` Install: ${t.installCommand}`))}if(n.sandbox.length>0){console.log(M.bold("\n🔒 Sandbox Dependencies")),console.log(M.gray(`Platform: ${t}`));for(const t of n.sandbox)t.installed?(console.log(M.green(`✓ ${t.name}`),M.gray(`- ${t.description}`)),e&&t.path&&console.log(M.gray(` Location: ${t.path}`))):(console.log(M.red(`❌ ${t.name}`),M.gray(`- ${t.description}`)),t.installCommand&&console.log(M.blue(` Install: ${t.installCommand}`)))}else console.log(M.bold("\n🔒 Sandbox Dependencies")),console.log(M.yellow(`⚠️ Platform ${t} not supported - sandbox will be disabled`));if(n.allSatisfied)return console.log(M.bold.green("\n✓ All required dependencies are installed")),!0;{console.log(M.bold.red("\n⚠️ Missing Required Dependencies"));const e=[...n.missingCli,...n.missingSandbox];for(const n of e)console.log(M.red(` • ${n.name}`));console.log(M.yellow("\nPlease install missing dependencies before starting the daemon."))}}(!0)}console.log(M.bold("\n🤖 Daemon Status"));try{const n=await fn(),t=await oe.readDaemonState();if(n&&t?(console.log(M.green("✓ Daemon is running")),console.log(` PID: ${t.pid}`),console.log(` Started: ${new Date(t.startTime).toLocaleString()}`),console.log(` CLI Version: ${t.cliVersion}`),t.port&&console.log(` HTTP Port: ${t.port}`)):t&&!n?console.log(M.yellow("⚠️ Daemon state exists but process not running (stale)")):console.log(M.red("❌ Daemon is not running")),t){console.log(M.bold("\n📄 Daemon State:"));const e=oe.getStatePaths();console.log(M.blue(`Location: ${e.daemonStateFile}`)),console.log(M.gray(JSON.stringify(t,null,2)))}const s=await at();if(s.length>0){console.log(M.bold("\n🔍 All Agentrix CLI Processes"));const e=s.reduce((e,n)=>(e[n.type]||(e[n.type]=[]),e[n.type].push(n),e),{});Object.entries(e).forEach(([e,n])=>{console.log(M.blue(`\n${{daemon:"🤖 Daemon","upgrade-daemon":"🔄 Upgrade Daemon",worker:"🔗 Workers",doctor:"🩺 Doctor",unknown:"❓ Unknown"}[e]||e}:`)),n.forEach(({pid:n,command:t})=>{const s=e.startsWith("dev")?M.cyan:e.includes("daemon")?M.blue:M.gray;console.log(` ${s(`PID ${n}`)}: ${M.gray(t)}`)})})}else console.log(M.red("❌ No agentrix processes found"));"all"===e&&s.length>1&&(console.log(M.bold("\n💡 Process Management")),console.log(M.gray("To clean up runaway processes: agentrix killall")))}catch(e){console.log(M.red("❌ Error checking daemon status"))}}let pt=null;async function lt(){const e=ht(),n=function(e){try{return JSON.stringify(e)}catch{return""}}(e);if(pt&&pt.expiresAt>Date.now()&&pt.overridesSignature===n)return pt.openers;const t=ut(e),s=[];for(const e of t){const n=e.isSupported();n&&s.push({id:e.id,label:e.label,kind:e.kind,method:e.method,urlTemplate:e.urlTemplate,supported:n})}return pt={expiresAt:Date.now()+6048e5,openers:s,overridesSignature:n},s}function dt(e){const n=process.platform;if("darwin"===n)return function(e){const n=mt(e),t=[];if(n){const e=wt(n);t.push("-e",`set defaultLocation to POSIX file "${e}"`,"-e","set chosenFolder to choose folder default location defaultLocation")}else t.push("-e","set chosenFolder to choose folder");return t.push("-e","POSIX path of chosenFolder"),gt(bt("osascript",t,{captureOutput:!0}))}(e);if("win32"===n)return function(e){const n=vt("powershell")?"powershell":vt("pwsh")?"pwsh":null;if(!n)throw new Error("PowerShell is required to pick a directory");const t=mt(e),s=["Add-Type -AssemblyName System.Windows.Forms;","$dialog = New-Object System.Windows.Forms.FolderBrowserDialog;",t?`$dialog.SelectedPath = '${yt(t)}';`:"","$null = $dialog.ShowDialog();","$dialog.SelectedPath;"].filter(Boolean).join(" ");return gt(bt(n,"powershell"===n?["-NoProfile","-STA","-Command",s]:["-NoProfile","-Sta","-Command",s],{captureOutput:!0}))}(e);if("linux"===n)return function(e){const n=mt(e);if(vt("zenity")){const e=["--file-selection","--directory","--title=Select Folder"];if(n){const t=n.endsWith("/")?n:`${n}/`;e.push(`--filename=${t}`)}return gt(bt("zenity",e,{captureOutput:!0}))}if(vt("kdialog")){const e=["--getexistingdirectory"];return n&&e.push(n),gt(bt("kdialog",e,{captureOutput:!0}))}throw new Error("No supported directory picker is available")}(e);throw new Error("Directory picker is not supported on this platform")}function ut(e){const n=process.platform,t=["Visual Studio Code","Visual Studio Code - Insiders"],s=["Cursor"],a=["IntelliJ IDEA","IntelliJ IDEA CE","IntelliJ IDEA Ultimate"],i=["WebStorm"],o=["PyCharm","PyCharm CE","PyCharm Professional"],c=[{id:"vscode",label:"VS Code",kind:"editor",method:"scheme",urlTemplate:"vscode://file/{path}?windowId=_blank",scheme:"vscode",macAppNames:t,isSupported:()=>ft("vscode",n,t)},{id:"cursor",label:"Cursor",kind:"editor",method:"scheme",urlTemplate:"cursor://file/{path}?windowId=_blank",scheme:"cursor",macAppNames:s,isSupported:()=>ft("cursor",n,s)},{id:"idea",label:"IntelliJ IDEA",kind:"ide",method:"scheme",urlTemplate:"idea://open?file={path}&newWindow=true",scheme:"idea",macAppNames:a,isSupported:()=>ft("idea",n,a)},{id:"pycharm",label:"PyCharm",kind:"ide",method:"scheme",urlTemplate:"pycharm://open?file={path}&newWindow=true",scheme:"pycharm",macAppNames:o,isSupported:()=>ft("pycharm",n,o)},{id:"webstorm",label:"WebStorm",kind:"ide",method:"scheme",urlTemplate:"webstorm://open?file={path}&newWindow=true",scheme:"webstorm",macAppNames:i,isSupported:()=>ft("webstorm",n,i)},{id:"file-manager",label:"darwin"===n?"Finder":"win32"===n?"Explorer":"Files",kind:"file-manager",method:"cli",isSupported:()=>function(e){return"darwin"===e?vt("open"):"win32"===e||"linux"===e&&(vt("xdg-open")||vt("gio"))}(n),open:e=>function(e,n){if("darwin"!==n){if("win32"!==n){if("linux"===n)return vt("xdg-open")?void bt("xdg-open",[e]):void bt("gio",["open",e]);throw new Error("File manager open is not supported on this platform")}bt("explorer",[e])}else bt("open",[e])}(e,n)},{id:"open-with",label:"Open With...",kind:"system",method:"cli",isSupported:()=>function(e){return"darwin"===e?vt("osascript"):"win32"===e?vt("powershell")||vt("pwsh"):"linux"===e&&vt("gio")}(n),open:e=>function(e,n){if("darwin"!==n)if("win32"!==n){if("linux"!==n)throw new Error("Open With is not supported on this platform");bt("gio",["open","--ask",e])}else bt(vt("powershell")?"powershell":"pwsh",["-NoProfile","-Command",`Start-Process -Verb OpenAs -FilePath '${yt(e)}'`]);else if(null===bt("osascript",["-e",`set targetPath to POSIX file "${wt(e)}"`,"-e","set appChoice to choose application","-e","tell appChoice to open targetPath"],{captureOutput:!0}))throw new Error("No application selected")}(e,n)}];return function(e,n,t){const s=t??ht();return e.map(e=>{const t=s[e.id];if(!t)return e;if(!1===t.enabled)return{...e,isSupported:()=>!1};const a={...e,label:t.label??e.label,method:t.method??e.method,urlTemplate:t.urlTemplate??e.urlTemplate};if(t.command){const s=function(e){return e?Array.isArray(e)?e:[e]:[]}(t.appName??e.macAppNames);a.method="cli",a.isSupported=()=>function(e,n,t){return"darwin"===t&&n.length>0?n.some(e=>xt(e)):v.isAbsolute(e)||e.includes(v.sep)?r(e):vt(e)}(t.command,s,n),a.open=e=>function(e,n,t){if(!bt(e,(n&&n.length>0?n:["{path}"]).map(e=>e.split("{path}").join(t))))throw new Error(`Command failed: ${e}`)}(t.command,t.args,e)}return a})}(c,n,e)}function mt(e){if(!e)return;const n=e.replace(/^~(?=$|[\\/])/,t.homedir());if(r(n)){try{if(!p(n).isDirectory())return}catch{return}return n}}function gt(e){if(!e)return null;return e.trim()||null}function ht(){try{const e=oe.readSettings();if(!e||"object"!=typeof e)return{};const n=e.openersOverrides;return n&&"object"==typeof n?n:{}}catch(e){return re.warn("[OPENERS] Failed to read opener overrides",e),{}}}function ft(e,n,s){return"darwin"===n?function(e,n){if(vt("mdfind")){const n=bt("mdfind",[`kMDItemCFBundleURLSchemes == '${e}'`],{captureOutput:!0});if(n&&n.trim())return!0}if(vt("plutil")){const n=[v.join(t.homedir(),"Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist"),"/Library/Preferences/com.apple.LaunchServices/com.apple.launchservices.secure.plist"];for(const t of n){if(!r(t))continue;const n=bt("plutil",["-extract","LSHandlers","json","-o","-",t],{captureOutput:!0});if(n)try{const t=JSON.parse(n);if(Array.isArray(t)&&t.some(n=>n.LSHandlerURLScheme?.toLowerCase()===e.toLowerCase()))return!0}catch(e){re.debug("[OPENERS] Failed to parse LaunchServices handlers",e)}}}return!!(n&&n.length>0)&&n.some(e=>xt(e))}(e,s):"win32"===n?function(e){return vt("reg")&&(Boolean(bt("reg",["query",`HKCU\\Software\\Classes\\${e}`]))||Boolean(bt("reg",["query",`HKCR\\${e}`])))}(e):"linux"===n&&function(e){if(vt("xdg-settings")){const n=bt("xdg-settings",["get","default-url-scheme-handler",e],{captureOutput:!0});if(n&&n.trim()&&"null"!==n.trim())return!0}if(vt("gio")){const n=bt("gio",["mime",`x-scheme-handler/${e}`],{captureOutput:!0});if(n&&/Default application/.test(n))return!0}return!1}(e)}function xt(e){return"darwin"===process.platform&&Boolean(bt("open",["-Ra",e]))}function vt(e){return"win32"===process.platform?Boolean(bt("where",[e])):Boolean(bt("sh",["-c",`command -v ${e}`]))}function bt(e,n,t){const s=je(e,n,{encoding:t?.captureOutput?"utf8":void 0,stdio:t?.captureOutput?"pipe":"ignore",windowsHide:!0});if(0!==s.status){if(t?.captureOutput){const t="string"==typeof s.stderr?s.stderr.trim():"";t&&re.warn(`[OPENERS] Command failed: ${e} ${n.join(" ")}: ${t}`)}return null}return t?.captureOutput?s.stdout:"ok"}function yt(e){return e.replace(/'/g,"''")}function wt(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function kt(e,n){if(n){const t=e.startsWith(n)?e.slice(n.length).replace(/^\//,""):w(e);return b(n,"versions",t)}let t=y(e),s=0;for(;s<10;){if(r(b(t,"agent.json"))){const n=e.slice(t.length).replace(/^\//,"");return b(t,"versions",n)}const n=y(t);if(n===t)break;t=n,s++}const a=y(e),i=w(e);return b(a,`.${i}.version`)}function It(e,n){const t=kt(e,n);if(!r(t))return"0.0.0";try{return c(t,"utf-8").trim()}catch(e){return"0.0.0"}}function St(e,t,s){try{const a=kt(e,s),i=y(a);if(!r(i)){const{mkdirSync:e}=n("node:fs");e(i,{recursive:!0})}l(a,t,"utf-8")}catch(e){}}function Tt(e,n){const t=e.split(".").map(Number),s=n.split(".").map(Number);for(let e=0;e<3;e++){const n=t[e]||0,a=s[e]||0;if(n>a)return 1;if(n<a)return-1}return 0}function Et(e,n,t){const s=It(e,t),a=Tt(n.metadata.version,s);if(!r(e)){const s=y(e);if(!r(s)){const{mkdirSync:e}=o;e(s,{recursive:!0})}return l(e,n.content,"utf-8"),St(e,n.metadata.version,t),{updated:!0,reason:"created"}}if(a<=0)return{updated:!1,reason:"up-to-date"};switch(n.metadata.updateStrategy){case"overwrite":return l(e,n.content,"utf-8"),St(e,n.metadata.version,t),{updated:!0,reason:"overwritten"};case"create-only":return{updated:!1,reason:"create-only"};case"notify-user":return{updated:!1,reason:"requires-user-approval"};default:return{updated:!1,reason:"unknown-strategy"}}}async function Ct(e){const{agentId:n,gitUrl:t,branch:s,subDir:a}=e,i=b(oe.agentrixAgentsHomeDir,n);if(r(i))return{agentDir:i};const o=`${i}.tmp-${Date.now()}`;try{const e=["git","clone","--depth=1"];if(s&&e.push("--branch",s),e.push(t,o),qe(e.join(" "),{stdio:"pipe"}),a){const e=b(o,a);if(!r(e))throw new Error(`Sub-directory "${a}" not found in cloned repository`);d(e,i),u(o,{recursive:!0,force:!0})}else d(o,i);return At(i),{agentDir:i}}catch(e){throw r(o)&&u(o,{recursive:!0,force:!0}),r(i)&&u(i,{recursive:!0,force:!0}),e}}function At(e){const n=[],t=b(e,"claude","plugins");if(r(t))for(const e of m(t)){const s=b(t,e);p(s).isDirectory()&&r(b(s,"package.json"))&&n.push(s)}const s=b(e,"claude","hooks");r(s)&&r(b(s,"package.json"))&&n.push(s);for(const e of n)qe("yarn install --frozen-lockfile",{cwd:e,stdio:"pipe"}),qe("yarn build",{cwd:e,stdio:"pipe"})}function Mt(e){return e.split("\\").join("/")}function _t(e,n){const t=b(n,"template","versions",`${e}.json`);if(!r(t))return{};try{const e=c(t,"utf-8");return JSON.parse(e)}catch(e){return console.warn(`[Companion] Failed to parse ${t}:`,e),{}}}async function Pt(e){const n=oe.agentrixAgentsHomeDir,t=b(n,"companion"),s=b(t,"claude");if(!r(b(t,"agent.json"))){const n=e?.credentials?.token;if(n)try{const e=await async function(e){const n=`${oe.serverUrl}/v1/agents/${encodeURIComponent("companion")}/git-url`;try{const t=await fetch(n,{headers:{Authorization:`Bearer ${e}`}});return t.ok?t.json():null}catch(e){return null}}(n);e&&(await Ct({agentId:"companion",gitUrl:e.gitUrl,branch:e.branch,subDir:e.subDir??"companion"}),console.log("[Companion] Installed from git"))}catch(e){console.warn("[Companion] Git install failed, will retry next boot:",e instanceof Error?e.message:e)}r(b(t,"agent.json"))||(console.log("[Companion] Falling back to public repo..."),await Ct({agentId:"companion",gitUrl:"https://github.com/xmz-ai/agentrix-agent",branch:"main",subDir:"companion"}))}var a;a=b(s,"memory"),r(a)||g(a,{recursive:!0});const{language:i,templates:o}=function(e,n){const t=function(e){const n=[e,process.env.AGENTRIX_COMPANION_TEMPLATE_LANGUAGE,process.env.LC_ALL,process.env.LC_MESSAGES,process.env.LANG];for(const e of n){if(!e)continue;const n=e.trim().toLowerCase();if(n){if(n.startsWith("zh"))return"zh-Hans";if(n.startsWith("en"))return"en"}}return"en"}(e),s=_t("common",n),a=_t(t,n),i=[],o={version:"1.0.0",updateStrategy:"create-only"};for(const[e,t]of Object.entries(s)){const s=b(n,e);r(s)&&i.push({relativePath:e,content:c(s,"utf-8"),metadata:t})}const l=function(e){const n={};if(!r(e))return n;const t=s=>{const a=m(s).sort();for(const i of a){const a=b(s,i);if(p(a).isDirectory()){t(a);continue}if("versions.json"===i)continue;const o=Mt(k(e,a));n[o]=c(a,"utf-8")}};return t(e),n}(b(n,"template","languages",t));for(const[e,n]of Object.entries(l))i.push({relativePath:e,content:n,metadata:a[e]||o});if(0===i.length)throw new Error(`Companion template files are missing in ${n}`);return{language:t,templates:i}}(e?.preferredLanguage,t),d=[];for(const e of o){const n=Et(b(t,e.relativePath),e,t);if(d.push({path:e.relativePath,updated:n.updated,reason:n.reason}),n.updated){const t="created"===n.reason?"Created":"Updated";console.log(`[Companion] ${t}: ${e.relativePath}`)}}const u=function(e,n){const t=[];for(const s of e){if("notify-user"!==s.metadata.updateStrategy)continue;const e=b(n,s.relativePath);if(!r(e))continue;const a=It(e,n);Tt(s.metadata.version,a)>0&&t.push({template:s,targetPath:e,currentVersion:a,newVersion:s.metadata.version})}return t}(o,t);if(u.length>0)try{const e=b(s,"UPGRADES.md"),n=function(e){return`# Upgrades Available\n\nThe following files have new versions available:\n\n${e.map(e=>`- **${e.template.metadata.description||e.template.relativePath}**: v${e.currentVersion} → v${e.newVersion}`).join("\n")}\n\n---\n\n**Shadow's Instructions:**\n\nWhen you detect this file:\n1. Send a reminder to the main companion using \`mcp__agentrix__send_reminder\`\n2. Content: "System upgrade detected. ${e.length} file(s) available."\n3. Reference this file path so main companion can read details\n4. Exit quietly\n\n**Main Companion's Instructions:**\n\nWhen you receive the upgrade reminder:\n1. Choose appropriate timing (don't interrupt user's work)\n2. Read this file to see what's new\n3. For each upgrade, read the corresponding \`.upgrade\` file\n4. Present to user naturally, explain benefits\n5. If user agrees: integrate the new content in your own voice\n6. Update version files using Write tool (create \`.filename.version\` with new version number)\n7. Delete \`.upgrade\` files when done\n8. Delete this file when all upgrades are handled\n`}(u);l(e,n,"utf-8");for(const e of u){const n=`${e.targetPath}.upgrade`,t=`# Upgrade: ${e.template.metadata.description||e.template.relativePath}\n\n**Current Version**: v${e.currentVersion}\n**New Version**: v${e.newVersion}\n\n---\n\n## New Content\n\n${e.template.content}\n\n---\n\n## Integration Instructions\n\n1. Read the new content above\n2. Compare with your current \`${e.template.relativePath}\`\n3. Integrate the new features in your own voice\n4. Keep your existing customizations\n5. Use Write tool to update \`versions/${e.template.relativePath}\` with content: "${e.newVersion}"\n6. Delete this file when done\n`;l(n,t,"utf-8")}console.log(`[Companion] Created UPGRADES.md with ${u.length} pending upgrade(s)`),console.log("[Companion] Shadow will notify main companion on next heartbeat")}catch(e){console.warn("[Companion] Failed to create upgrade files (permission denied?):",e instanceof Error?e.message:e),console.warn("[Companion] Upgrade detection will be skipped. Please check sandbox permissions for agents directory.")}return console.log(`[Companion] Language: ${i}`),{agentDir:t,homeDir:s}}function Rt(e,n){const t=[],s=m(e,{withFileTypes:!0});for(const a of s){if(".gitkeep"===a.name)continue;const s=b(e,a.name),i=p(s),o=k(n,s);t.push({name:a.name,path:o,size:i.size,modifiedAt:i.mtimeMs,isDirectory:a.isDirectory()}),a.isDirectory()&&t.push(...Rt(s,n))}return t}function $t({getChildren:e,stopSession:n,requestShutdown:t,registerSession:s,credentials:a}){return new Promise(i=>{const o=Re({logger:!1});o.setValidatorCompiler(Oe),o.setSerializerCompiler(Ne);const d=o.withTypeProvider(),u=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")};d.post("/session-started",{schema:{body:$e.object({sessionId:$e.string(),metadata:$e.any()}),response:{200:$e.object({status:$e.literal("ok")})}}},async e=>{const{sessionId:n,metadata:t}=e.body;return re.debug(`[CONTROL SERVER] Session started: ${n}`),s(n,t),{status:"ok"}}),d.options("/ping",async(e,n)=>(u(n),n.send())),d.get("/ping",{schema:{response:{200:$e.object({status:$e.literal("ok"),machineId:$e.string(),timestamp:$e.string()})}}},async(e,n)=>(u(n),{status:"ok",machineId:a.machineId,timestamp:(new Date).toISOString()})),d.options("/openers",async(e,n)=>(u(n),n.send())),d.get("/openers",{schema:{response:{200:$e.object({openers:$e.array($e.object({id:$e.string(),label:$e.string(),kind:$e.enum(["system","file-manager","editor","ide"]),method:$e.enum(["scheme","cli"]),urlTemplate:$e.string().optional(),supported:$e.boolean()}))})}}},async(e,n)=>(u(n),{openers:await lt()})),d.options("/open",async(e,n)=>(u(n),n.send())),d.options("/pick-directory",async(e,n)=>(u(n),n.send())),d.post("/open",{schema:{body:$e.object({path:$e.string(),openerId:$e.string(),userId:$e.string().optional(),taskId:$e.string().optional()}),response:{200:$e.object({success:$e.boolean(),error:$e.string().optional()})}}},async(e,n)=>{u(n);const{path:t,openerId:s,userId:a,taskId:i}=e.body;return await async function({openerId:e,targetPath:n,userId:t,taskId:s}){const a=ut(ht()).find(n=>n.id===e);if(!a)return{success:!1,error:"Unknown openerId"};if("cli"!==a.method||!a.open)return{success:!1,error:"Opener is not executable by CLI"};if(!a.isSupported())return{success:!1,error:"Opener is not supported on this system"};let i;try{i=function(e,n,t){const s=v.resolve(e);if(!v.isAbsolute(s))throw new Error("Path must be absolute");if(!p(s).isDirectory())throw new Error("Path must be a directory");if(n&&t){const e=oe.getTaskCwd(n,t);if(e&&!function(e,n){const t=v.relative(n,e);return""===t||!t.startsWith("..")&&!v.isAbsolute(t)}(s,v.resolve(e)))throw new Error("Path is outside the task workspace")}return s}(n,t,s)}catch(e){return{success:!1,error:e instanceof Error?e.message:"Invalid path"}}try{return a.open(i),{success:!0}}catch(e){const n=e instanceof Error?e.message:"Failed to open path";return re.warn(`[OPENERS] Failed to open path: ${n}`),{success:!1,error:n}}}({openerId:s,targetPath:t,userId:a,taskId:i})}),d.post("/pick-directory",{schema:{body:$e.object({defaultPath:$e.string().optional()}),response:{200:$e.object({path:$e.string().nullable(),error:$e.string().optional()})}}},async(e,n)=>{u(n);try{return{path:dt(e.body.defaultPath)??null}}catch(e){return{path:null,error:e instanceof Error?e.message:"Failed to pick directory"}}}),d.post("/companion/ensure",{schema:{body:$e.object({preferredLanguage:$e.enum(["en","zh-Hans"]).nullable().optional()}).optional(),response:{200:$e.object({agentDir:$e.string()})}}},async e=>await Pt({preferredLanguage:e.body?.preferredLanguage,credentials:a})),d.get("/companion/workspace",{schema:{response:{200:$e.object({files:$e.array($e.object({name:$e.string(),path:$e.string(),size:$e.number(),modifiedAt:$e.number(),isDirectory:$e.boolean()}))})}}},async()=>{const{homeDir:e}=await Pt({credentials:a});return r(e)?{files:Rt(e,e)}:{files:[]}}),d.get("/companion/file",{schema:{querystring:$e.object({path:$e.string()}),response:{200:$e.object({content:$e.string()}),404:$e.object({error:$e.string()})}}},async(e,n)=>{const{homeDir:t}=await Pt({credentials:a}),s=I(b(t,e.query.path));return s.startsWith(t)&&r(s)?{content:c(s,"utf-8")}:n.code(404).send({error:"File not found"})}),d.put("/companion/file",{schema:{body:$e.object({path:$e.string(),content:$e.string()}),response:{200:$e.object({success:$e.boolean()}),400:$e.object({error:$e.string()})}}},async(e,n)=>{const{homeDir:t}=await Pt({credentials:a}),s=I(b(t,e.body.path));return s.startsWith(t)?(g(y(s),{recursive:!0}),l(s,e.body.content,"utf-8"),{success:!0}):n.code(400).send({error:"Invalid path"})}),d.get("/companion/config",{schema:{response:{200:$e.object({heartbeatIntervalMs:$e.number(),heartbeatEnabled:$e.boolean()})}}},async()=>{const{homeDir:e}=await Pt({credentials:a}),n=b(e,"state.json");let t=9e5,s=!1;if(r(n))try{const e=JSON.parse(c(n,"utf-8"));"number"==typeof e.heartbeatIntervalMs&&(t=e.heartbeatIntervalMs),"boolean"==typeof e.heartbeatEnabled&&(s=e.heartbeatEnabled)}catch{}return{heartbeatIntervalMs:t,heartbeatEnabled:s}}),d.put("/companion/config",{schema:{body:$e.object({heartbeatIntervalMs:$e.number().optional(),heartbeatEnabled:$e.boolean().optional()}),response:{200:$e.object({success:$e.boolean()})}}},async e=>{const{homeDir:n}=await Pt({credentials:a}),t=b(n,"state.json");let s={};if(r(t))try{s=JSON.parse(c(t,"utf-8"))}catch{}const{heartbeatIntervalMs:i,heartbeatEnabled:o}=e.body;return void 0!==i&&(s.heartbeatIntervalMs=i),void 0!==o&&(s.heartbeatEnabled=o),g(y(t),{recursive:!0}),l(t,JSON.stringify(s,null,2),"utf-8"),{success:!0}}),d.post("/agent/install",{schema:{body:$e.object({agentId:$e.string(),gitUrl:$e.string(),branch:$e.string().optional(),subDir:$e.string().optional()}),response:{200:$e.object({agentDir:$e.string()}),500:$e.object({error:$e.string()})}}},async(e,n)=>{try{return await Ct(e.body)}catch(e){const t=e instanceof Error?e.message:String(e);return n.code(500).send({error:t})}}),d.post("/list",{schema:{response:{200:$e.object({children:$e.array($e.object({startedBy:$e.string(),taskId:$e.string(),pid:$e.number()}))})}}},async()=>({children:e().filter(e=>void 0!==e.taskId).map(e=>({startedBy:e.startedBy,taskId:e.taskId,pid:e.pid}))})),d.post("/stop-session",{schema:{body:$e.object({sessionId:$e.string()}),response:{200:$e.object({success:$e.boolean()})}}},async e=>{const{sessionId:t}=e.body;return re.debug(`[CONTROL SERVER] Stop session request: ${t}`),{success:n(t)}}),d.post("/stop",{schema:{response:{200:$e.object({status:$e.string()})}}},async()=>(re.debug("[CONTROL SERVER] Stop daemon request received"),setTimeout(()=>{re.debug("[CONTROL SERVER] Triggering daemon shutdown"),t()},50),{status:"stopping"}));const m=e=>new Promise((n,t)=>{o.listen({port:e,host:"127.0.0.1"},(e,s)=>{e?t(e):n(s)})});(async()=>{let e;try{e=await m(30624)}catch(n){const t=n?.code;if("EADDRINUSE"!==t&&"EACCES"!==t)throw re.info("[CONTROL SERVER] Failed to start:",n),n;re.info(`[CONTROL SERVER] Port 30624 unavailable (${t??"error"}), falling back to dynamic port`),e=await m(0)}const n=parseInt(e.split(":").pop());re.info(`[CONTROL SERVER] Started on port ${n}`),i({port:n,stop:async()=>{await o.close(),re.info("[CONTROL SERVER] Server stopped")}})})().catch(e=>{throw re.info("[CONTROL SERVER] Failed to start:",e),e})})}function Dt(e,n={}){const t=ce(),s=b(t,"dist","index.mjs"),a=["--no-warnings","--no-deprecation",s,...e];if(!r(s)){const e=`Entrypoint ${s} does not exist`;throw re.debug(`[SPAWN Agentrix CLI] ${e}`),new Error(e)}return Ce(process.execPath,a,n)}const Ot=[{version:1,fileName:"001_init.sql"}];function Nt(e){var n;return function(e,n){const t=new Le(e),s=new Ge;t.pragma("journal_mode = WAL"),function(e){const n=function(){const e=ke(We(import.meta.url)),n=[we(e,"migrations"),we(process.cwd(),"dist","migrations"),we(process.cwd(),"src","worker","history","migrations")];for(const e of n)if(xe(e))return e;throw new Error(`Task history migrations directory not found at ${n[0]}`)}(),t=e.pragma("user_version",{simple:!0}),s=function(e,n){const t=we(e,n);return fe(t,"utf8")}(n,Ot[0].fileName);e.exec(s),t<Ot[0].version&&e.pragma(`user_version = ${Ot[0].version}`)}(t);const a=t.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=t.prepare("SELECT local_sequence FROM task_message WHERE event_id = ?"),o=t.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=t.prepare("\n UPDATE task_event\n SET sequence = ?\n WHERE event_id = ? AND (sequence IS NULL OR sequence < ?)\n "),c=t.prepare("\n SELECT * FROM task_event\n WHERE sequence > ? AND event_type = 'task-message'\n ORDER BY sequence ASC\n LIMIT ?\n "),p=t.prepare("\n SELECT 1 as has_row\n FROM task_event\n WHERE sequence > ? AND event_type = 'task-message'\n LIMIT 1\n "),l=t.prepare("\n SELECT * FROM task_message\n ORDER BY local_sequence DESC\n LIMIT ?\n "),d=t.prepare("\n SELECT * FROM task_message\n WHERE local_sequence > ?\n ORDER BY local_sequence ASC\n LIMIT ?\n "),u=t.prepare("\n SELECT * FROM task_message\n WHERE local_sequence < ?\n ORDER BY local_sequence DESC\n LIMIT ?\n "),m=t.prepare("\n SELECT 1 as has_row\n FROM task_message\n WHERE local_sequence < ?\n LIMIT 1\n "),g=t.prepare("\n SELECT 1 as has_row\n FROM task_message\n WHERE local_sequence > ?\n LIMIT 1\n "),h=t.prepare("\n SELECT * FROM task_message\n WHERE local_sequence > ?\n ORDER BY local_sequence DESC\n LIMIT ?\n "),f=t.prepare("\n SELECT agent_id, session_id, last_sequence\n FROM task_agent_session\n "),x=t.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=t.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 t=e.eventId??N(),o=(new Date).toISOString();a.run({eventId:t,taskId:n,senderType:e.senderType,senderId:e.senderId,senderName:e.senderName,message:JSON.stringify(e.message),createdAt:o});const r=i.get(t),c=r?.local_sequence??null;return null!==c&&s.emit("message-saved",{eventId:t}),{eventId:t,localSequence:c}},saveTaskEvent:e=>{const n=e.eventId??N(),t=(new Date).toISOString(),s={...e.eventData,eventId:n};return o.run({eventId:n,taskId:e.taskId,chatId:e.chatId,sequence:e.sequence,eventType:e.eventType,eventData:JSON.stringify(s),createdAt:t}),n},updateTaskEventSequence:(e,n)=>{r.run(n,e,n)},pageTaskEventsAfter:(e,n)=>{const t=c.all(e,n).map(qt),s=t.at(-1)?.sequence??null;return{data:t,hasMore:null!==s&&Boolean(p.get(s))}},getLatestTaskEvent:e=>{if(0===e.length)return null;const n=e.map(()=>"?").join(","),s=t.prepare(`\n SELECT * FROM task_event\n WHERE event_type IN (${n})\n ORDER BY created_at DESC, rowid DESC\n LIMIT 1\n `).get(...e);return s?qt(s):null},pageRecentMessages:e=>{const n=l.all(e).map(jt).reverse(),t=n[0]?.localSequence??null;return{data:n,hasMore:!!t&&Boolean(m.get(t))}},pageMessagesAfter:(e,n)=>{const t=d.all(e,n).map(jt),s=t.at(-1)?.localSequence??null;return{data:t,hasMore:!!s&&Boolean(g.get(s))}},pageMessagesBefore:(e,n)=>{const t=u.all(e,n).map(jt).reverse(),s=t[0]?.localSequence??null;return{data:t,hasMore:!!s&&Boolean(m.get(s))}},pageRecentMessagesAfter:(e,n)=>{const t=h.all(e,n).map(jt).reverse(),s=t[0]?.localSequence??null;return{data:t,hasMore:!!s&&Boolean(m.get(s))}},getAgentSessions:()=>{const e=f.all(),n=new Map;for(const t of e)n.set(t.agent_id,t.session_id);return n},getAgentLastSequences:()=>{const e=f.all(),n=new Map;for(const t of e)n.set(t.agent_id,t.last_sequence);return n},upsertAgentSession:(e,t)=>{x.run(e,n,t,(new Date).toISOString())},updateAgentLastSequence:(e,t)=>{v.run(e,n,t,(new Date).toISOString())},on:(e,n)=>{s.on(e,n)},off:(e,n)=>{s.off(e,n)},close:()=>{s.removeAllListeners(),t.close()}}}((n=e.dataDir,we(n,"data.bin")),e.taskId)}function jt(e){const n=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:n,createdAt:e.created_at}}function qt(e){const n=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:n,createdAt:e.created_at}}class Ut{pidToTrackedSession;pidToAwaiter;taskToStartPromise;sandboxPool;constructor(e){this.pidToTrackedSession=new Map,this.pidToAwaiter=new Map,this.taskToStartPromise=new Map,this.sandboxPool=e||null}isProcessAlive(e){try{return process.kill(e,0),!0}catch{return!1}}getAliveSessionByTaskId(e){for(const[n,t]of this.pidToTrackedSession.entries())if(t.taskId===e){if(this.isProcessAlive(n))return t;this.pidToTrackedSession.delete(n)}}getCurrentSessions(){return Array.from(this.pidToTrackedSession.values())}getSessionByPid(e){return this.pidToTrackedSession.get(e)}registerTaskWorker(e,n){const t=n.pid;if(!t)return void re.warn(`[SESSION] Missing PID for task ${e}`);re.info(`[SESSION] Registered task ${e}, PID: ${t}`);const s=this.pidToTrackedSession.get(t);if(s&&s.taskId===e){const e=this.pidToAwaiter.get(t);e&&(this.pidToAwaiter.delete(t),e(s))}else if(!s){const n={startedBy:"cli",taskId:e,pid:t};this.pidToTrackedSession.set(t,n)}}async decryptTaskMessage(e){if(!e.dataEncryptionKey)return;const n=await oe.getSecretKey();if(!n)return;const t=O(D(e.dataEncryptionKey),n);if(!t)return void re.warn("[SESSION] Failed to decrypt data encryption key");if(e.dataEncryptionKey=_(t),"task-message"!==e.event)return;const s=e.eventData;if(!s.encryptedMessage)return;const a=L(s.encryptedMessage,t);a?e.eventData={...s,message:a,encryptedMessage:void 0}:re.warn("[SESSION] Failed to decrypt task message")}persistCreateTaskStart(e){const n=Nt({dataDir:oe.resolveDataDir(e.userId,e.taskId),taskId:e.taskId});try{const t=e.eventData;n.saveTaskEvent({eventType:e.event,eventId:t.eventId,eventData:t,taskId:e.taskId,chatId:e.chatId,sequence:t.sequence??0}),t.message&&n.saveMessage({eventId:t.eventId,message:t.message,senderType:t.senderType,senderId:t.senderId,senderName:t.senderName})}finally{n.close()}}persistResumeTaskStart(e){const n=Nt({dataDir:oe.resolveDataDir(e.userId,e.taskId),taskId:e.taskId}),t=e.eventData.sequence;if(null==t)throw new Error(`Missing resume sequence for task ${e.taskId}`);try{const s=e.eventData;n.saveTaskEvent({eventType:e.event,eventId:s.eventId,eventData:s,taskId:e.taskId,chatId:e.chatId,sequence:t}),s.message&&n.saveMessage({eventId:s.eventId,message:s.message,senderType:s.senderType,senderId:s.senderId,senderName:s.senderName})}finally{n.close()}}trackWorkerProcess(e,n){const t={startedBy:"daemon",pid:n.pid,childProcess:n,taskId:e.taskId};this.pidToTrackedSession.set(n.pid,t),n.on("exit",(t,s)=>{this.pidToTrackedSession.delete(n.pid),this.sandboxPool&&this.sandboxPool.disposeWorkerSandbox(e.taskId)}),n.on("error",t=>{this.pidToTrackedSession.delete(n.pid),this.sandboxPool&&this.sandboxPool.disposeWorkerSandbox(e.taskId)})}async startWorker(e,n){const t={eventId:N(),status:"success",opCode:e.eventId};await this.decryptTaskMessage(e),oe.writeTaskInput(e),"create-task"===n?this.persistCreateTaskStart(e):this.persistResumeTaskStart(e);const s=this.taskToStartPromise.get(e.taskId);if(s)return re.info(`[SESSION] Task ${e.taskId} is already starting, skip duplicate ${n}`),s;const a=this.startWorkerInternal(e,n,t).finally(()=>{this.taskToStartPromise.get(e.taskId)===a&&this.taskToStartPromise.delete(e.taskId)});return this.taskToStartPromise.set(e.taskId,a),a}async startWorkerInternal(e,n,t){const s=this.getAliveSessionByTaskId(e.taskId);if(s)return re.info(`[SESSION] Task ${e.taskId} already has worker PID ${s.pid}, skip duplicate ${n}`),t.message=`Worker already running (PID ${s.pid})`,t;const a=oe.resolveProjectCWD(e.userCwd,e.userId,e.taskId),i=["worker","--type",e.agentType||"claude","--started-by","daemon","--task-id",e.taskId,"--user-id",e.userId,"--idle-timeout","120"];let o;if(this.sandboxPool?.isEnabled())try{if(!await this.sandboxPool.createWorkerSandbox(e.taskId,e.userId,a))throw new Error("Failed to create sandbox instance");const{projectPath:n}=await import("./logger-gqEfOYLW.mjs").then(function(e){return e.d}),{join:t}=await import("path"),s=["--no-warnings","--no-deprecation",t(n(),"dist","index.mjs"),...i],r=`"${process.execPath}" ${s.map(e=>`"${e}"`).join(" ")}`,c=await this.sandboxPool.wrapWorkerCommand(e.taskId,r);re.debug(`[SESSION] Sandboxed command for task ${e.taskId}: ${c}`),o=Ce(c,{shell:!0,cwd:a,detached:!0,stdio:["ignore","pipe","pipe"],env:{...process.env}}),re.info(`[SESSION] Worker started with sandbox, PID: ${o.pid}`)}catch(n){return re.error(`[SESSION] Failed to setup sandbox for task ${e.taskId}:`,n),t.status="failed",t.message=`Sandbox setup failed: ${n instanceof Error?n.message:String(n)}`,t}else o=Dt(i,{cwd:a,detached:!0,stdio:["ignore","pipe","pipe"],env:{...process.env}}),re.info(`[SESSION] Worker started without sandbox, PID: ${o.pid}`);if(process.env.DEBUG&&(o.stdout?.on("data",e=>{re.debug(`[Daemon] worker stdout: ${e.toString()}`)}),o.stderr?.on("data",e=>{re.debug(`[Daemon] worker stderr: ${e.toString()}`)})),!o.pid)return t.status="failed",t.message="Failed to start worker - no PID",t;re.info(`[SESSION] Worker started, PID: ${o.pid}`),this.trackWorkerProcess(e,o);const[r,c]=function(e){let n,t;const s=new Promise(s=>{n=e=>{clearTimeout(t),s(e)},t=setTimeout(()=>{s(e.onTimeout())},e.timeoutMs)});return[s,n,()=>clearTimeout(t)]}({timeoutMs:15e3,onTimeout:()=>(this.pidToAwaiter.delete(o.pid),t.status="failed",t.message=`Worker timeout (PID ${o.pid})`,t)});return this.pidToAwaiter.set(o.pid,()=>{c(t)}),r}stopSession(e){for(const[n,t]of this.pidToTrackedSession.entries())if(t.taskId===e){try{(t.childProcess?t.childProcess:{kill:e=>process.kill(n,e)}).kill("SIGTERM"),re.info(`[SESSION] Task ${e} stopped`);const s=setTimeout(()=>{const t=this.pidToTrackedSession.get(n);if(t&&t.taskId===e&&this.isProcessAlive(n))try{process.kill(n,"SIGKILL"),re.warn(`[SESSION] Task ${e} did not exit after SIGTERM, sent SIGKILL to PID ${n}`)}catch(t){re.warn(`[SESSION] Failed to force kill task ${e} (PID ${n}):`,t)}},3e3);s.unref?.()}catch(t){re.warn(`[SESSION] Failed to stop task ${e}:`,t),this.isProcessAlive(n)||this.pidToTrackedSession.delete(n)}return!0}return re.warn(`[SESSION] Task ${e} not found`),!1}pruneStaleSessions(){for(const[e,n]of this.pidToTrackedSession.entries())try{process.kill(e,0)}catch(n){this.pidToTrackedSession.delete(e)}}shutdown(){re.info("[SESSION] Shutting down all sessions");for(const[e,n]of this.pidToTrackedSession.entries())try{"daemon"===n.startedBy&&n.childProcess?n.childProcess.kill("SIGTERM"):process.kill(e,"SIGTERM")}catch(n){re.warn(`[SESSION] Failed to stop PID ${e}:`,n)}this.pidToTrackedSession.clear(),this.pidToAwaiter.clear()}async startDeploymentWorker(e){const n={eventId:N(),status:"success",opCode:e.eventId};oe.writeTaskInput(e);try{const t=Dt(["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&&(t.stdout?.on("data",e=>{re.debug(`[Deployment] worker stdout: ${e.toString()}`)}),t.stderr?.on("data",e=>{re.debug(`[Deployment] worker stderr: ${e.toString()}`)})),!t.pid)return n.status="failed",n.message="Failed to start deployment worker - no PID",n;re.info(`[SESSION] Deployment worker started, PID: ${t.pid}`);const s={taskId:e.taskId,userId:e.userId};return this.trackWorkerProcess(s,t),n}catch(e){return n.status="failed",n.message=`Failed to start deployment worker: ${e instanceof Error?e.message:String(e)}`,n}}}class Gt{networkManager=null;workerSandboxes=new Map;settings=null;platform;constructor(){this.platform=Pe()}async initialize(e){if(this.settings=e,!e.enabled)return re.info("[SANDBOX] Sandbox disabled via settings"),!1;if(!Fe(this.platform))return re.warn("[SANDBOX] Platform not supported, sandbox disabled"),!1;try{const n={allowedDomains:[new URL(oe.serverUrl).hostname,...e.network.allowedDomains],deniedDomains:e.network.deniedDomains,allowLocalBinding:!1};return this.networkManager=new ze,await this.networkManager.initialize(n),re.info("[SANDBOX] Sandbox pool initialized successfully"),!0}catch(e){throw re.error("[SANDBOX] Failed to initialize:",e),e}}async createWorkerSandbox(e,n,t){if(!this.networkManager||!this.settings?.enabled)return null;try{const s=oe.resolveUserWorkSpaceDir(n),a=oe.getStatePaths().logsDir,i=this.settings.filesystem||{},o=this.settings.env||{},r={...i,allowWrite:[...i.allowWrite||[],s,t,a]};if("linux"===this.platform&&i.allowRead){const e=ye.dirname(process.execPath);r.allowRead=[...i.allowRead,e]}const c={filesystem:r,env:o},p=new Be(this.networkManager,c);return this.workerSandboxes.set(e,p),re.info(`[SANDBOX] Created sandbox for task ${e}`),p}catch(n){return re.error(`[SANDBOX] Failed to create sandbox for task ${e}:`,n),null}}async wrapWorkerCommand(e,n){const t=this.workerSandboxes.get(e);if(!t)throw new Error(`No sandbox found for task ${e}`);const s=await t.wrapWithSandbox(n);return re.debug(`[SANDBOX] Wrapped command for task ${e}`),s}disposeWorkerSandbox(e){const n=this.workerSandboxes.get(e);n&&(n.dispose(),this.workerSandboxes.delete(e),re.debug(`[SANDBOX] Disposed sandbox for task ${e}`))}async shutdown(){re.info("[SANDBOX] Shutting down sandbox pool");for(const[e,n]of this.workerSandboxes.entries())n.dispose(),re.debug(`[SANDBOX] Disposed sandbox for task ${e}`);this.workerSandboxes.clear(),this.networkManager&&(await this.networkManager.shutdown(),this.networkManager=null,re.info("[SANDBOX] Network manager shutdown complete"))}isEnabled(){return!0===this.settings?.enabled}}class Lt{constructor(e,n){this.client=e,this.machineId=n;const t=oe.agentrixAgentsHomeDir,s=b(t,"companion","claude");this.stateFilePath=b(s,"state.json")}timer=null;initialDelay=null;intervalMs=9e5;enabled=!1;heartbeatTaskId=null;companionState=null;stateFilePath;start(){this.loadState(),this.companionState?re.info(`[COMPANION SCHEDULER] Ready: agent=${this.companionState.agentId}, chatId=${this.companionState.chatId}`):re.warn("[COMPANION SCHEDULER] No state.json found (companion not registered yet), will keep checking"),re.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),re.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),re.info("[COMPANION SCHEDULER] Cleared heartbeat task ID")}loadState(){try{if(r(this.stateFilePath)){this.companionState=JSON.parse(c(this.stateFilePath,"utf-8"));const e=this.companionState?.heartbeatIntervalMs??9e5;e!==this.intervalMs&&(re.info(`[COMPANION SCHEDULER] Interval changed: ${this.intervalMs}ms → ${e}ms`),this.intervalMs=e),this.enabled=this.companionState?.heartbeatEnabled??!1,this.heartbeatTaskId=this.companionState?.heartbeatTaskId??null,re.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){re.warn("[COMPANION SCHEDULER] Failed to load state.json",e)}}saveStateField(e,n){try{let t={};r(this.stateFilePath)&&(t=JSON.parse(c(this.stateFilePath,"utf-8"))),void 0===n?delete t[e]:t[e]=n;const s=y(this.stateFilePath);r(s)||g(s,{recursive:!0}),l(this.stateFilePath,JSON.stringify(t,null,2),"utf-8"),re.debug(`[COMPANION SCHEDULER] Saved state field: ${e}=${n??"removed"}`)}catch(n){re.warn(`[COMPANION SCHEDULER] Failed to save state field: ${e}`,n)}}tick(){if(this.loadState(),!this.companionState)return void re.debug("[COMPANION SCHEDULER] Still no state.json, skipping heartbeat");if(!this.enabled)return void re.debug("[COMPANION SCHEDULER] Heartbeat disabled, skipping");const e=this.companionState;this.heartbeatTaskId?(re.debug(`[COMPANION SCHEDULER] Sending heartbeat to existing task ${this.heartbeatTaskId}`),this.client.send("task-message",{eventId:N(),taskId:this.heartbeatTaskId,chatId:e.chatId,from:"machine",message:{type:"companion_heartbeat",timestamp:(new Date).toISOString()},senderType:"system",senderId:"system",senderName:"system"})):(re.debug("[COMPANION SCHEDULER] Requesting new heartbeat task"),this.client.send("request-companion-heartbeat",{eventId:N(),machineId:e.machineId,agentId:e.agentId,chatId:e.chatId,userId:e.userId,timestamp:(new Date).toISOString()}))}}async function Wt(){Object.assign(re,le({type:"daemon"}));const{requestShutdown:e,shutdownPromise:n}=function(){const{processType:e,onShutdownRequest:n}={processType:"daemon"},t=`[${e.toUpperCase()}]`;let s;const a=new Promise(e=>{s=(s,a)=>{re.info(`${t} Requesting shutdown (source: ${s}, errorMessage: ${a})`),n&&n(s,a),setTimeout(()=>process.exit(1),1e3),e({source:s,errorMessage:a})}}),i=e=>{process.on(e,()=>{s("os-signal")})};return i("SIGINT"),i("SIGTERM"),process.on("uncaughtException",e=>{re.info(`${t} FATAL: Uncaught exception`,e),re.info(`${t} Stack trace: ${e.stack}`),s("exception",e.message)}),process.on("unhandledRejection",e=>{re.info(`${t} FATAL: Unhandled promise rejection`,e);const n=e instanceof Error?e:new Error(`Unhandled promise rejection: ${e}`);re.info(`${t} Stack trace: ${n.stack}`),s("exception",n.message)}),process.on("exit",e=>{re.info(`${t} Process exiting with code: ${e}`)}),{requestShutdown:s,shutdownPromise:a}}();console.log("[DAEMON RUN] Starting daemon process..."),re.debug("[DAEMON RUN] Environment",rt()),await xn()&&(console.log("Daemon already running..."),process.exit(0));let t=await oe.acquireDaemonLock(5,200);for(;!t;)await bn(),t=await oe.acquireDaemonLock(5,200),t||(re.debug("[DAEMON RUN] cannot acquire daemon lock..."),process.exit(1));try{(function(){if(oe.disableCaffeinate)return re.debug("[caffeinate] Caffeinate disabled via AGENTRIX_DISABLE_CAFFEINATE environment variable"),!1;if("darwin"!==process.platform)return re.debug("[caffeinate] Not on macOS, skipping caffeinate"),!1;if(Zn&&!Zn.killed)return re.debug("[caffeinate] Caffeinate already running"),!0;try{return Zn=Ce("caffeinate",["-im"],{stdio:"ignore",detached:!1}),Zn.on("error",e=>{re.debug("[caffeinate] Error starting caffeinate:",e),Zn=null}),Zn.on("exit",(e,n)=>{re.debug(`[caffeinate] Process exited with code ${e}, signal ${n}`),Zn=null}),re.info(`[caffeinate] Started with PID ${Zn.pid}`),function(){if(tt)return;tt=!0;const e=()=>{nt()};process.on("exit",e),process.on("SIGINT",e),process.on("SIGTERM",e),process.on("SIGUSR1",e),process.on("SIGUSR2",e),process.on("uncaughtException",n=>{re.debug("[caffeinate] Uncaught exception, cleaning up:",n),e()}),process.on("unhandledRejection",(n,t)=>{re.debug("[caffeinate] Unhandled rejection, cleaning up:",n),e()})}(),!0}catch(e){return re.info("[caffeinate] Failed to start caffeinate:",e),!1}})()&&re.debug("[DAEMON RUN] Sleep prevention enabled");const s=await kn();re.debug("[DAEMON RUN] Auth and machine setup complete");const a=new Gt;await a.initialize(oe.getSandboxSettings());const i=new Ut(a),{port:o,stop:r}=await $t({getChildren:()=>i.getCurrentSessions(),stopSession:e=>i.stopSession(e),requestShutdown:()=>e("agentrix-cli"),registerSession:(e,n)=>i.registerTaskWorker(e,n),credentials:s});try{await lt(),re.debug("[DAEMON RUN] Openers detected")}catch(e){re.warn("[DAEMON RUN] Failed to detect openers",e)}const c={pid:process.pid,port:o,startTime:(new Date).toLocaleString(),cliVersion:pe.version,logPath:de({type:"daemon"})};oe.writeDaemonState(c),re.debug("[DAEMON RUN] Daemon state written");const p=new Qn({machineId:s.machineId,serverUrl:oe.serverUrl.replace(/^http/,"ws"),path:"/v1/ws",auth:W(s.token,s.machineId),keepAliveConfig:{intervalMs:2e4,event:"machine-alive",payloadGenerator:()=>({eventId:N(),machineId:s.machineId,timestamp:Date.now().toString(),controlPort:o})},healthCheckConfig:{enabled:!0,intervalMs:3e4,timeoutMs:5e3},logger:(e,...n)=>re.debug(`[DAEMON SOCKET] ${e}`,...n)},i,{requestShutdown:e});await p.connect(),re.info("[DAEMON RUN] Machine client connected to server");const l=new Lt(p.client,s.machineId);l.start(),p.client.onEvent("companion-heartbeat-response",e=>{e?.taskId&&l.setHeartbeatTaskId(e.taskId)});const d=async(e,n)=>{l.stop(),await p.disconnect(),await r(),await a.shutdown(),await vn(),await nt(),await oe.releaseDaemonLock(t),re.info("[DAEMON RUN] Cleanup completed, exiting process"),process.exit(0)};re.info("[DAEMON RUN] Daemon started successfully, waiting for shutdown request");const u=await n;await d(u.source,u.errorMessage)}catch(e){(function(e){return e instanceof Error&&e.message.includes("Machine binding revoked")})(e)&&(console.error("Machine binding is no longer valid."),console.error("Run `agentrix logout` and bind this machine again.")),re.info("[DAEMON RUN][FATAL] Failed somewhere unexpectedly - exiting with code 1",e),process.exit(1)}}const Ht={".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"};async function Ft(e,n,t=!1){try{const s=function(e){try{const n=new URL(e),t=S(n.pathname);if(t)return t;const s=n.searchParams.get("filename")||n.searchParams.get("name")||n.searchParams.get("file");if(s){const e=S(s);if(e)return e}return""}catch{return""}}(e)||"";let a;if(t)try{const n=new URL(e).pathname,t=w(n);a=t&&S(t)?t:`${se()}${s||".dat"}`}catch{a=`${se()}${s||".dat"}`}else a=`${se()}${s||".dat"}`;const i=b(n,a),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()||function(e){const n=e.toLowerCase();return Ht[n]||"application/octet-stream"}(s),p=o.body,l=h(i);return await Ke(p,l),{filePath:i,mimeType:c,filename:a}}catch(n){throw new Error(`Failed to download file from ${e}: ${n instanceof Error?n.message:String(n)}`)}}const zt={senderType:"system",senderId:"system",senderName:"system"};class Bt{client;context;historyDb;getPermissionMode;outbox=new Map;hasConnectedOnce=!1;constructor(e,n){const{taskId:t,userId:s,machineId:a,cwd:i,chatId:o,...r}=e,c=i.endsWith("/")?i:`${i}/`;this.client=new Sn(r),this.context={taskId:t,chatId:o,userId:s,machineId:a,cwd:c,stopTask:n.stopTask,shouldPersistTaskMessage:n.shouldPersistTaskMessage,onTaskMessage:n.onTaskMessage,onTaskInfoUpdate:n.onTaskInfoUpdate,onWorkerStatusRequest:n.onWorkerStatusRequest,onSubTaskResultUpdated:n.onSubTaskResultUpdated,onGitPush:n.onGitPush,dataEncryptionKey:e.dataEncryptionKey},this.historyDb=n.historyDb,this.getPermissionMode=n.getPermissionMode,this.initHandlers()}getPermissionModeSnapshot(){return this.getPermissionMode?.()??null}connect(){return new Promise((e,n)=>{const t=setTimeout(()=>{n(new Error("Worker connection timeout after 10 seconds"))},1e4);this.client.onLifecycle("connect",()=>{clearTimeout(t),e()}),this.client.onLifecycle("connect_error",e=>{clearTimeout(t),n(e)}),this.client.connect()})}async disconnect(){this.client.connected&&await this.client.flush(5e3).catch(()=>{}),this.client.disconnect()}sendTaskMessage(e,n,t){const s=N();return this.historyDb.saveMessage({eventId:s,message:n,senderType:e.senderType,senderId:e.senderId,senderName:e.senderName}),this.sendTaskEvent(e,n,t),s}sendWorkerInitializing(e){const n={eventId:N(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),cwd:this.context.cwd,...void 0!==e?.deployingAgent&&{deployingAgent:e.deployingAgent},...void 0!==e?.upgradingAgent&&{upgradingAgent:e.upgradingAgent}};this.client.send("worker-initializing",n)}sendWorkerInitialized(){const e={eventId:N(),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 n=this.getPermissionModeSnapshot(),t={eventId:N(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),...void 0!==e&&{duration:e},...null!==n&&{permissionMode:n}};this.client.send("worker-ready",t)}sendWorkRunning(e){const n=this.getPermissionModeSnapshot(),t={eventId:N(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),activeAgents:e,...null!==n&&{permissionMode:n}};this.client.send("worker-running",t)}sendPermissionMode(e){const n={eventId:N(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),permissionMode:e};this.client.send("worker-permission-mode",n)}sendWorkerExit(e){const n={eventId:N(),taskId:this.context.taskId,machineId:this.context.machineId,timestamp:(new Date).toISOString(),reason:e};this.client.send("worker-exit",n)}async sendErrorMessageAndExit(e){this.sendSystemErrorMessage(e),await this.client.flush(2e3),this.sendWorkerExit("error"),await this.disconnect()}sendSystemErrorMessage(e,n){const t={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(zt,t,{groupId:n?.groupId})}sendAssistantMessage(e,n){const t={type:"assistant",session_id:"",uuid:crypto.randomUUID(),parent_tool_use_id:null,message:{role:"assistant",content:[{type:"text",text:e}]}};this.sendTaskEvent(zt,t,{groupId:n?.groupId})}sendAskUser(e,n,t){return this.sendTaskMessage(e,{type:"ask_user",questions:n},{groupId:t?.groupId})}sendAskUserResponse(e,n){return this.sendTaskMessage(zt,n,{opCode:e})}sendTaskEvent(e,n,t){const{eventId:s,opCode:a,artifacts:i,navigateToTaskId:o}=t||{},r=s??N(),c={eventId:r,taskId:this.context.taskId,chatId:this.context.chatId,from:"worker",messageType:n.type,message:n,encryptedMessage:void 0,opCode:a,groupId:t?.groupId,senderType:e.senderType,senderId:e.senderId,senderName:e.senderName,artifacts:i,navigateToTaskId:o};if(this.historyDb.saveTaskEvent({eventType:"task-message",eventId:r,eventData:c,taskId:this.context.taskId,chatId:this.context.chatId,sequence:"number"==typeof c.sequence?c.sequence:null}),this.context.dataEncryptionKey){const e=H(n,this.context.dataEncryptionKey);c.message=void 0,c.encryptedMessage=e}return this.outbox.set(r,c),this.client.send("task-message",c),r}sendUpdateTaskAgentSessionId(e){const n={eventId:N(),taskId:this.context.taskId,agentSessionId:e,cwd:this.context.cwd};this.client.send("update-task-agent-session-id",n)}sendTaskSlashCommandsUpdate(e,n){const t={eventId:N(),taskId:this.context.taskId,commands:e,version:n,updatedAt:(new Date).toISOString()};this.client.send("task-slash-commands-update",t)}sendChangeTaskTitle(e){const n={eventId:N(),taskId:this.context.taskId,title:e};this.client.send("change-task-title",n),re.info(`[AGENT] Title changed to: ${e}`)}sendUpdateAgentInfo(e,n){const t={eventId:N(),taskId:this.context.taskId,agentId:e,...n};this.client.send("update-agent-info",t),re.info(`[AGENT] Agent info updated: ${JSON.stringify(n)}`)}sendResetTaskSession(){const e={eventId:N(),taskId:this.context.taskId};this.client.send("reset-task-session",e),re.info(`[AGENT] Session reset requested for task ${this.context.taskId}`)}async sendMergeRequest(e,n){const t={eventId:N(),taskId:this.context.taskId,summary:e,description:n};re.info(`[MERGE] Sending merge-request event for task ${this.context.taskId}`);const s=await this.client.sendWithAck("merge-request",t);if(!s.success)throw new Error(`Failed to create pull request: ${s.error||"Unknown error"}`);return re.info(`[MERGE] Pull request created: #${s.data.pullRequestNumber}`),{pullRequestNumber:s.data.pullRequestNumber,pullRequestUrl:s.data.pullRequestUrl}}async sendMergePr(){const e={eventId:N(),taskId:this.context.taskId,mergeMethod:"squash"};return re.info(`[MERGE-PR] Sending merge-pr event for task ${this.context.taskId}`),await this.client.sendWithAck("merge-pr",e)}associateRepository(e,n,t,s){const a={eventId:N(),taskId:this.context.taskId,gitServerHost:e,owner:n,repo:t,remoteUrl:s};re.info(`[REPO] Sending repository association request: ${e}/${n}/${t}`),this.client.send("associate-repo",a)}async dispatchTaskMessage(e){await this.context.onTaskMessage(e)}initHandlers(){const e=(n=this.context,t=this.historyDb,s=e=>{this.client.send("event-ack",{eventId:N(),status:"success",opCode:e})},{"cancel-task":async e=>{e.taskId===n.taskId&&(re.info(`[WORKER] Task ${n.taskId} cancelled`),await n.stopTask())},"stop-task":async e=>{e.taskId===n.taskId&&(re.info(`[WORKER] Task ${n.taskId} stopped: ${e.reason||"no reason"}`),await n.stopTask())},"task-message":async e=>{if(e.taskId!==n.taskId)return;let a=e.message??null;if(!a&&e.encryptedMessage&&n.dataEncryptionKey&&(a=L(e.encryptedMessage,n.dataEncryptionKey)??null),!a)return;const i={senderType:e.senderType,senderId:e.senderId,senderName:e.senderName};if(n.attachmentsDir&&F(a)&&(a=await async function(e,n){const{attachmentsDir:t,log:s}=n;if(!Array.isArray(e.message.content))return e;const a=await Promise.all(e.message.content.map(async e=>"image"===e.type&&"url"===e.source?.type&&e.source?.url?async function(e,n){try{n?.("info","IMAGE",`Downloading image from: ${e.source.url}`);const t=await fetch(e.source.url);if(!t.ok)return n?.("error","IMAGE",`Failed to download image: ${t.statusText}`),e;const s=await t.arrayBuffer(),a=Buffer.from(s),i=a.toString("base64");let o=t.headers.get("content-type")||"image/jpeg";if(!o.startsWith("image/")){const n=e.source.url.toLowerCase();o=n.endsWith(".png")?"image/png":n.endsWith(".gif")?"image/gif":n.endsWith(".webp")?"image/webp":"image/jpeg"}return n?.("info","IMAGE",`Image downloaded and converted to base64 (${o}, ${Math.round(a.length/1024)}KB)`),{type:"image",source:{type:"base64",media_type:o,data:i}}}catch(t){return n?.("error","IMAGE",`Error processing image: ${t}`),e}}(e,s):"document"===e.type&&"url"===e.source?.type&&e.source?.url?async function(e,n,t){try{const s=e.source.url;t?.("info","DOCUMENT",`Downloading document from: ${s}`);const{filePath:a,mimeType:i,filename:o}=await Ft(s,n,!0);return t?.("info","DOCUMENT",`Document downloaded to: ${a}`),{type:"text",text:`Document: ${a}\nTitle: ${e.title||o}\nType: ${i}`}}catch(n){return t?.("error","DOCUMENT",`Error processing document: ${n}`),e}}(e,t,s):e));return{...e,message:{...e.message,content:a}}}(a,{attachmentsDir:n.attachmentsDir,log:n.logger})),n.shouldPersistTaskMessage&&!await n.shouldPersistTaskMessage(a,i))return void re.debug(`[WORKER] Dropping incoming task-message before persistence: eventId=${e.eventId}`);const o={...e,message:a,encryptedMessage:void 0,chatId:e.chatId??n.chatId};t.saveTaskEvent({eventType:"task-message",eventId:e.eventId,eventData:o,taskId:n.taskId,chatId:e.chatId??n.chatId,sequence:e.sequence??null}),t.saveMessage({eventId:e.eventId,message:a,senderType:e.senderType,senderId:e.senderId,senderName:e.senderName}),s(e.eventId),n.onTaskMessage&&await n.onTaskMessage(a,i)},"task-info-update":async e=>{e.taskId===n.taskId&&n.onTaskInfoUpdate&&await n.onTaskInfoUpdate(e)},"worker-status-request":async e=>{e.taskId===n.taskId&&n.onWorkerStatusRequest&&await n.onWorkerStatusRequest(e)},"sub-task-result-updated":async e=>{e.parentTaskId===n.taskId&&n.onSubTaskResultUpdated&&await n.onSubTaskResultUpdated(e)}});var n,t,s;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 n=e.data?.sequence;void 0!==e.opCode&&this.outbox.delete(e.opCode),void 0!==e.opCode&&"number"==typeof n&&this.historyDb.updateTaskEventSequence(e.opCode,n)}),this.client.onLifecycle("connect",()=>{if(this.hasConnectedOnce){if(this.outbox.size>0){re.info(`[WORKER] Reconnected — flushing ${this.outbox.size} outbox message(s)`);for(const e of this.outbox.values())this.client.send("task-message",e)}}else this.hasConnectedOnce=!0})}}class Kt{logger;socketClient;taskId;userId;chatId;rootTaskId;parentTaskId;workingDirectory;taskAgents;serverUrl;taskDataKey;agentHomeDir;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.agentHomeDir=e.agentHomeDir,this.taskAgents=e.taskAgents,this.serverUrl=e.serverUrl,this.taskDataKey=e.taskDataKey}async call(e,n,t){const s=N();try{const a=await this.socketClient.sendWithAck("rpc-call",{eventId:s,taskId:this.taskId,method:e,path:n,query:t?.query,body:t?.body});if(!a.success){const t=a.error||{code:"unknown",message:"Unknown error"};throw new Error(`RPC ${e} ${n} failed: ${t.message} (${t.code})`)}return a.data}catch(t){throw new Error(`RPC ${e} ${n} error: ${t.message}`)}}log(e){this.logger.info(e)}getWorkspace(){return this.workingDirectory}getAgentHomeDir(){return this.agentHomeDir}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,n){return this.call("PATCH",`/v1/draft-agent/${e}`,{body:n})}async startSubTask(e){const n={userId:this.userId,chatId:this.chatId,agentId:e.agentId,parentTaskId:this.taskId,customTitle:e.title,cwd:e.cwd,forceUserCwd:e.forceUserCwd};return this.taskDataKey?n.encryptedMessage=H(e.message,this.taskDataKey):n.message=e.message,{taskId:(await this.call("POST","/v1/tasks/start",{body:n})).taskId}}async startIndependentTask(e){const n={userId:this.userId,chatId:this.chatId,agentId:e.agentId,sourceTaskId:this.taskId,customTitle:e.title,cwd:e.cwd,forceUserCwd:e.forceUserCwd,autoNavigate:e.autoNavigate};return this.taskDataKey?n.encryptedMessage=H(e.message,this.taskDataKey):n.message=e.message,{taskId:(await this.call("POST","/v1/tasks/start",{body:n})).taskId}}async startGroupTask(e){const n={userId:this.userId,chatId:e.chatId??this.chatId,parentTaskId:this.taskId,customTitle:e.title,todos:e.todos};return this.taskDataKey?n.encryptedMessage=H(e.message,this.taskDataKey):n.message=e.message,{taskId:(await this.call("POST","/v1/tasks/start",{body:n})).taskId}}async createGroupChat(e){return this.call("POST","/v1/agent-group-chats",{body:{agentIds:e}})}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 n=await this.call("GET","/v1/tasks/find-by-agent",{query:{parentTaskId:this.taskId,agentId:e}});return n.taskId?{taskId:n.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 listAgents(){return this.call("GET","/v1/user-agents")}async uploadFile(e){this.logger.info("[Agent-Context] Uploading file...");const n=await ge.promises.stat(e.path);this.logger.info("[Agent-Context] file stats");const t=n.size,s=e.contentType||Dn.lookup(e.name)||"application/octet-stream",a=(await this.call("POST","/v1/files/upload-urls",{body:{count:1}})).files[0],i=a.url;this.logger.info(`[Agent-Context] FileUploadUrl: ${i}`);const o=await ge.promises.readFile(e.path),r=await fetch(i,{method:"PUT",headers:{"Content-Type":s},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:a.id,name:e.name,size:t,contentType:s,visibility:e.visibility||"private"}}),c="public"===e.visibility?`${this.serverUrl}/v1/files/public/${a.id}`:i.split("?")[0],{fileId:a.id,name:e.name,size:t,contentType:s,url:c}}}function Vt(e,n){const t=e.split("\n");return t.length<=n?e:t.slice(0,n).join("\n")+"..."}function Xt(e,n){let t=e.resultMessage;if(0===t.result.trim().length&&e.encryptedResultMessage&&n){const s=L(e.encryptedResultMessage,n);s&&"result"===s.type&&(t={type:"result",result:"result"in s?s.result:"",is_error:s.is_error})}const s={...e,resultMessage:{...t,result:Vt(t.result,3)}};let a=`<sub-task-result-updated>\n${JSON.stringify(s,null,2)}\n</sub-task-result-updated>`;return a+=t.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:a}}}function Yt(){const e=new Set;return{filter(n){const t=n;if(!t.message||!t.message.content||"string"==typeof t.message.content)return n;const s=t.message.content.filter(n=>!("tool_result"===n.type&&e.has(n.tool_use_id)||"user"===t.type&&"tool_result"!==n.type));return 0===s.length?null:(t.message.content=s,t)},clear(){e.clear()}}}function Jt(e){const n=ss(e);return n?{type:"user",message:{role:"user",content:[{type:"text",text:`<msg ${Zt({seq:n.seq.toString(),at:n.at,senderType:n.senderType??void 0,senderId:n.senderId??void 0,senderName:n.senderName??void 0})}>${n.text}</msg>\n`},...n.nonTextBlocks]},parent_tool_use_id:null,session_id:""}:null}function Qt(e){const n=ss(e);return n?`<msg ${Zt({seq:n.seq.toString(),at:n.at,senderType:n.senderType??void 0,senderId:n.senderId??void 0,senderName:n.senderName??void 0})}>\n${n.text}\n</msg>`:null}function Zt(e){return Object.entries(e).filter(([,e])=>void 0!==e&&""!==e).map(([e,n])=>`${e}="${function(e){return e.replaceAll("&","&").replaceAll('"',""").replaceAll("<","<").replaceAll(">",">")}(n)}"`).join(" ")}function es(e){const n=[];for(const t of e){const e=Qt(t);e&&n.push(e)}return n.join("\n")}function ns(e){return`Ask user: ${e.questions.map((e,n)=>{const t=e.options?.map(e=>e.label).filter(Boolean),s=t&&t.length>0?` options: ${t.join(", ")}`:"";return`Q${n+1}[${e.header}] ${e.question}${s}`}).join(" | ")}`}function ts(e){const n=e.status?` status=${e.status}`:"",t=e.reason?` reason=${e.reason}`:"",s=e.answers?.length?e.answers.join(", "):"no answers",a=e.details?.filter(Boolean).join(" | ");return`Ask user response:${n}${t} answers: ${s}${a?` details: ${a}`:""}`}function ss(e){const{text:n,nonTextBlocks:t}=(s=e.message,z(s)?{text:ns(s),nonTextBlocks:[]}:B(s)?{text:ts(s),nonTextBlocks:[]}:K(s)?function(e){switch(e.type){case"user":case"assistant":return function(e){if("string"==typeof e)return{text:e,nonTextBlocks:[]};if(Array.isArray(e)){const n=[],t=[];for(const s of e)"text"!==s.type||"string"!=typeof s.text?t.push(s):n.push(s.text);return{text:n.join("\n"),nonTextBlocks:t}}return{text:"",nonTextBlocks:[]}}(e.message.content);case"result":if("success"===e.subtype)return{text:e.result,nonTextBlocks:[]}}return{text:"",nonTextBlocks:[]}}(s):{text:"",nonTextBlocks:[]});var s;return n?{seq:e.localSequence,at:e.createdAt,senderType:e.senderType,senderId:e.senderId,senderName:e.senderName,text:n,nonTextBlocks:t}:null}function as({workClient:e}){return Ve("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:$e.string().describe("New title for the task")},async n=>(e.sendChangeTaskTitle(n.title),{content:[{type:"text",text:`Task title updated to: ${n.title}`}]}))}function is({agentContext:e,log:n}){return Ve("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:$e.string().describe("Sub-task ID to send follow-up instructions to"),instructions:$e.string().describe("Additional instructions for the sub-task")},async t=>{try{return await e.sendMessage({taskId:t.taskId,message:{type:"user",message:{role:"user",content:t.instructions}},target:"agent"}),{content:[{type:"text",text:`Sent follow-up instructions to sub-task ${t.taskId}.`}]}}catch(e){return n("error","TASK",`Failed to send follow-up to sub-task ${t.taskId}:`,e),{content:[{type:"text",text:`Failed to send follow-up to sub-task: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function os({historyDb:e}){return Ve("get_task_history","Retrieve earlier task history stored locally for additional context.",{sequence:$e.number().int().describe("Return messages before this local sequence (exclusive)."),limit:$e.number().int().min(1).max(50).default(20).describe("Maximum number of messages to return.")},async n=>{const t=n.limit??20,s=e.pageMessagesBefore(n.sequence,t);return 0===s.data.length?{content:[{type:"text",text:"No earlier messages found."}]}:{content:[{type:"text",text:es(s.data)}]}})}function rs({agentContext:e}){return Ve("get_task_agents","List the agents available for the current task and return taskAgents info.",{},async()=>{const n=e.getTaskAgents();return n.length?{content:[{type:"text",text:JSON.stringify(n,null,2)}]}:{content:[{type:"text",text:"No task agents available."}]}})}function cs({agentContext:e,log:n}){return Ve("list_sub_task","List direct sub tasks for the current task with taskId, title, and cwd.",{},async()=>{try{const n=await e.listSubTasks();return n.length?{content:[{type:"text",text:JSON.stringify(n,null,2)}]}:{content:[{type:"text",text:"No sub tasks found."}]}}catch(e){return n("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 ps({agentContext:e,agentId:n,log:t,setPendingNavigateTaskId:s}){return Ve("create_task","Delegate a task to an agent for execution.\n\n**Modes**:\n- Sub-task (default): Creates under current task, linked via parentTaskId.\n- Independent (independent=true): Creates a top-level task with no parent binding. Optionally set autoNavigate=true to auto-switch the user's App UI to the new task.\n\nIf agentId is provided, delegates to that specific agent. Otherwise, creates a task for yourself.\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.",{agentId:$e.string().optional().describe('Target agent ID (e.g., "agent-poster-generator"). If not provided, uses current agent.'),title:$e.string().min(1).max(200).describe("Task title for the agent to use (required)"),instructions:$e.string().describe("Detailed instructions for the agent. Be specific about what needs to be done."),briefSummary:$e.string().describe('One-line summary shown to user immediately (e.g., "Creating login page")'),cwd:$e.string().optional().describe("Working directory for the task. Pass your current cwd when the sub-task needs to read/write the same project files as you. If omitted, a new isolated workspace is created (scoped by taskId)."),useWorktree:$e.boolean().optional().describe("Whether to create a git worktree for isolation. Defaults to false (work in-place)."),independent:$e.boolean().optional().describe("Create as independent top-level task (no parent). Defaults to false (sub-task mode)."),autoNavigate:$e.boolean().optional().describe("Auto-switch App UI to this task after creation. Only works with independent=true. Defaults to false.")},async a=>{try{if(a.autoNavigate&&!a.independent)return{content:[{type:"text",text:"Error: autoNavigate can only be used with independent=true"}],isError:!0};const i=a.agentId||n;let o;return a.independent?(o=await e.startIndependentTask({agentId:i,message:{type:"user",message:{role:"user",content:a.instructions}},title:a.title,cwd:a.cwd,forceUserCwd:!a.useWorktree,autoNavigate:a.autoNavigate}),a.autoNavigate&&s(o.taskId),t("info","TASK",`Created independent task ${o.taskId} for agent ${i} (autoNavigate: ${a.autoNavigate??!1})`)):(o=await e.startSubTask({agentId:i,message:{type:"user",message:{role:"user",content:a.instructions}},title:a.title,cwd:a.cwd,forceUserCwd:!a.useWorktree}),t("info","TASK",`Created sub-task ${o.taskId} for agent ${i}`)),{content:[{type:"text",text:`🚀 Task created: ${o.taskId}\n${a.agentId?`Agent: ${i}\n`:""}${a.independent?"Mode: Independent\n":""}Summary: ${a.briefSummary}\n\nYou'll receive a <sub-task-result-updated> notification when the task completes. Continue responding to the user.`}]}}catch(e){return t("error","TASK","Failed to create task:",e),{content:[{type:"text",text:`Failed to create task: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function ls({agentContext:e,log:n}){return Ve("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:$e.string().min(1).max(200).describe("Task title"),instructions:$e.string().describe("Instructions for the owner agent"),briefSummary:$e.string().optional().describe("One-line summary shown to user immediately"),agentId:$e.string().describe("Target agent ID"),cwd:$e.string().optional().describe("Working directory for the sub-task. Pass your current cwd when the sub-task needs to read/write the same project files as you. If omitted, a new isolated workspace is created (scoped by sub-task taskId)."),useWorktree:$e.boolean().optional().describe("Whether to create a git worktree for isolation. Defaults to false (work in-place).")},async t=>{try{return{content:[{type:"text",text:`🚀 Task created: ${(await e.startSubTask({agentId:t.agentId,message:{type:"user",message:{role:"user",content:t.instructions}},title:t.title,cwd:t.cwd,forceUserCwd:!t.useWorktree})).taskId}\n${t.briefSummary?`Summary: ${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","Create solo task failed:",e),{content:[{type:"text",text:`Create solo task failed: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function ds({agentContext:e,log:n,agentId:t}){return Ve("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:$e.string().min(1).max(200).describe("Task title"),requirement:$e.string().describe("Overall requirement"),briefSummary:$e.string().optional().describe("One-line summary shown to user immediately"),todos:$e.array($e.object({agentId:$e.string().describe("Agent ID responsible for the todo"),title:$e.string().min(1).max(200).describe("Todo title"),instructions:$e.string().describe("Detailed instructions for this todo")})).min(1).describe("Todo list for agents")},async t=>{try{return{content:[{type:"text",text:`🚀 Task created: ${(await e.startGroupTask({title:t.title,todos:t.todos,message:{type:"user",message:{role:"user",content:t.requirement}}})).taskId}\n${t.briefSummary?`Summary: ${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","DISPATCH","Dispatch failed:",e),{content:[{type:"text",text:`Dispatch failed: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}function us({askUser:e,log:n}){return Ve("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:$e.array($e.object({question:$e.string().describe("The complete question to ask the user"),header:$e.string().max(12).describe("Short label displayed as a chip/tag (max 12 chars)"),multiSelect:$e.boolean().describe("Set to true to allow multiple option selections"),options:$e.array($e.object({label:$e.string().describe("Option label (1-5 words)"),description:$e.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 t=>{try{const n=t.questions.map(e=>({...e,options:[...e.options,{label:"Other",description:""}]})),s=await e(n);return"answered"!==(s.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${s.answers.map(e=>e.startsWith("other:")?`Other: "${e.slice(6)}"`:e).join("\n")}`}]}}catch(e){return n("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 ms({invokeAgent:e}){return Ve("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:$e.string().describe("Target agent ID"),hint:$e.string().optional().describe("Optional context/instruction for the agent")},async n=>(e(n.agentId,n.hint),{content:[{type:"text",text:`Invoked ${n.agentId}. The agent will respond in the chat later.`}]}))}function gs({workClient:e,agentId:n,uploadFile:t,log:s}){return Ve("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:$e.string().optional().describe("Your display name"),avatarPath:$e.string().optional().describe("Local path to avatar image file (png/jpg/svg)"),signature:$e.string().optional().describe("Short status line or tagline shown under your name")},async a=>{let i;if(a.avatarPath)try{i=(await t({name:"avatar.png",path:a.avatarPath,visibility:"public"})).fileId}catch(e){return s("error","TOOL","Avatar upload failed:",e),{content:[{type:"text",text:`Avatar upload failed: ${e}`}],isError:!0}}e.sendUpdateAgentInfo(n,{displayName:a.displayName,avatar:i,signature:a.signature});const o=[];return a.displayName&&o.push(`name → ${a.displayName}`),i&&o.push("avatar → uploaded"),a.signature&&o.push(`signature → ${a.signature}`),{content:[{type:"text",text:`Profile updated: ${o.join(", ")}`}]}})}function hs({assign:e,log:n}){return Ve("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:$e.string().describe("Target agent ID"),instruction:$e.string().describe("Task instruction for the agent"),acknowledgment:$e.string().optional().describe('Agent\'s quick reply shown immediately (e.g., "starting now", "On it")')},async n=>(e(n.agentId,n.instruction,n.acknowledgment),{content:[{type:"text",text:`Assigned work to ${n.agentId}.`}]}))}function fs({agentContext:e,log:n}){return Ve("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:$e.number().int().min(1).max(50).default(10).optional().describe("Maximum number of tasks to return (default 10)."),status:$e.enum(["all","active","completed"]).default("all").optional().describe("Filter by task status: all, active, or completed.")},async t=>{try{const n=await e.listTasks({limit:t.limit??10,status:t.status??"all"});return n.length?{content:[{type:"text",text:JSON.stringify(n,null,2)}]}:{content:[{type:"text",text:"No tasks found."}]}}catch(e){return n("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 xs({chatHistoryDb:e}){return Ve("read_conversation","Read recent messages from the main conversation between you and the user. Use this to review what was discussed recently.",{limit:$e.number().int().min(1).max(200).default(50).optional().describe("Number of recent messages to return (default 50)."),before:$e.number().int().optional().describe("Sequence number — return messages before this sequence for pagination.")},async n=>{if(!e)return{content:[{type:"text",text:"Chat history not available in this mode."}],isError:!0};const t=n.limit??50,s=null!=n.before?e.pageMessagesBefore(n.before,t):e.pageRecentMessages(t);if(0===s.data.length)return{content:[{type:"text",text:"No conversation messages found."}]};let a=es(s.data);return s.hasMore&&(a+=`\n\nMore messages available. Use before=${Math.min(...s.data.map(e=>e.localSequence))} to load earlier messages.`),{content:[{type:"text",text:a}]}})}function vs({agentContext:e,log:n}){return Ve("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:$e.string().describe('Brief reminder message (one sentence, e.g., "Heartbeat architecture discussion pending for 2 days, consider following up")'),filePath:$e.string().optional().describe("Path to detailed analysis file in workspace, if any")},async t=>{try{const n=e.getChatId();return await e.sendMessage({taskId:n,message:{type:"companion_reminder",content:t.content,filePath:t.filePath,timestamp:(new Date).toISOString()},target:"agent"}),{content:[{type:"text",text:"Reminder sent to main companion."}]}}catch(e){return n("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 bs({uploadFile:e,log:t}){return Ve("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., ).",{filePath:$e.string().describe("Absolute path to the local file to upload"),name:$e.string().optional().describe("Display name for the file (defaults to filename)")},async s=>{try{const t=n("path"),a=s.name||t.basename(s.filePath);return{content:[{type:"text",text:(await e({name:a,path:s.filePath,visibility:"public"})).url}]}}catch(e){return t("error","TOOL","File upload failed:",e),{content:[{type:"text",text:`File upload failed: ${e}`}],isError:!0}}})}function ys({agentContext:e,log:n}){return Ve("list_agents","List all available agents for the current user, including system agents and user-created agents (both published and draft).",{},async()=>{try{const{agents:n,draftAgents:t}=await e.listAgents(),s=e=>`- **${e.displayName||e.name}** (${e.id})\n Type: ${e.type}\n`+(e.developerName?` Developer: ${e.developerName}\n`:"")+` ${e.description||"No description"}\n`;let a="# Available Agents\n\n";return n.length>0&&(a+="## Published Agents\n\n",a+=n.map(s).join("\n")),t.length>0&&(a+="\n## Draft Agents\n\n",a+=t.map(s).join("\n")),0===n.length&&0===t.length&&(a+="No agents available."),{content:[{type:"text",text:a}]}}catch(e){return n("error","AGENTS","Failed to list agents:",e),{content:[{type:"text",text:`Failed to list agents: ${e instanceof Error?e.message:"Unknown error"}`}],isError:!0}}})}const ws=Ze(Ue);async function ks(e){try{const n=Qe(e);return await n.checkIsRepo()}catch{return!1}}async function Is(e){const n=Qe(e);await n.add("."),await n.commit("Initial commit",{"--allow-empty":null})}async function Ss(e,n,t){const s=Qe(e);(await s.branchLocal()).all.includes(n)?await s.checkout(n):(t&&await s.checkout(t),await s.checkoutLocalBranch(n))}async function Ts(e){const n=Qe(e);return!(await n.status()).isClean()}async function Es(e){const n=Qe(e),t=await n.log({maxCount:1});if(!t.latest)throw new Error("No commits found in repository");return t.latest.hash}async function Cs(e){try{const n=Qe(e);return null!==(await n.log({maxCount:1})).latest}catch{return!1}}function As(e){if(!r(e))return!0;const n=m(e);return 0===n.length||1===n.length&&".git"===n[0]}function Ms(e){const n=e.match(/^(.*)?\{([^}]*) => ([^}]*)\}(.*)$/);if(!n)return e;const[,t="",,s,a=""]=n;return`${t}${s}${a}`}async function _s(e,n,t){const s=Qe(e),a=await s.diffSummary([`${n}..${t}`]);return{totalInsertions:a.insertions,totalDeletions:a.deletions,files:a.files.map(e=>({path:Ms(V(e.file)),insertions:"insertions"in e?e.insertions:0,deletions:"deletions"in e?e.deletions:0}))}}async function Ps(e,n){try{const{stdout:t}=await ws("git",n,{cwd:e,maxBuffer:10485760});return t}catch(e){const n=e;if(1===n.code&&"string"==typeof n.stdout)return n.stdout;throw e}}function Rs(e){return e.split("\n").map(e=>e.trim()).filter(Boolean).map(e=>function(e){const[n,t,s]=e.split("\t");if(!n||!t||!s)return null;const a="-"===n?0:Number.parseInt(n,10),i="-"===t?0:Number.parseInt(t,10);if(Number.isNaN(a)||Number.isNaN(i))return null;const o=s.startsWith("/dev/null => ")?s.slice(13):s;return{path:Ms(V(o)),insertions:a,deletions:i}}(e)).filter(e=>null!==e)}function $s(e,n){return ae("sha256").update(`${e}\n${n}`).digest("hex")}async function Ds(e,n){const t=await Ps(e,["diff","--binary","--find-renames",n,"--"]),s=Rs(await Ps(e,["diff","--numstat","--find-renames",n,"--"])),a=await async function(e){const{stdout:n}=await ws("git",["ls-files","--others","--exclude-standard","-z"],{cwd:e,maxBuffer:10485760});return n.split("\0").filter(Boolean)}(e),i=await Promise.all(a.map(n=>Ps(e,["diff","--no-index","--binary","--","/dev/null",n]))),o=Rs((await Promise.all(a.map(n=>Ps(e,["diff","--no-index","--numstat","--","/dev/null",n])))).join("\n")),r=function(e){const n=e.trim();return n?`${n}\n`:""}([t,...i].filter(Boolean).join("\n"));return r?{patch:r,stats:{totalInsertions:(c=[...s,...o]).reduce((e,n)=>e+n.insertions,0),totalDeletions:c.reduce((e,n)=>e+n.deletions,0),files:c},artifactVersion:$s(n,r)}:null;var c}async function Os(e){const n=Qe(e);return(await n.revparse(["--abbrev-ref","HEAD"])).trim()}async function Ns(e,n,t){const s=Qe(e);await s.remote(["set-url",n,t])}const js="oauth2",qs="AGENTRIX_GIT_USERNAME",Us="AGENTRIX_GIT_PASSWORD";function Gs(){const e=b(s(),`git-askpass-${se()}.sh`);return l(e,`#!/bin/sh\ncase "$1" in\n *Username*|*username*) printf '%s\\n' "\${${qs}:-${js}}" ;;\n *) printf '%s\\n' "\${${Us}:-}" ;;\nesac\n`,{mode:448}),e}function Ls(e,n,t=js){return{...process.env,GIT_ASKPASS:e,GIT_TERMINAL_PROMPT:"0",[qs]:t,[Us]:n}}function Ws(e){return{gitUrl:e.gitUrl,baseBranch:e.baseBranch,branchName:e.branchName,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 Hs(e,n){return n??`agentrix/${e}`}async function Fs(e){if(!e)return null;const n=await oe.getSecretKey();return n?Un(e,n):null}async function zs(e,n){const t=function(e){const n=function(e){return b(qn,`${e}.pat.meta.json`)}(e);if(!r(n))return null;try{return JSON.parse(c(n,"utf8"))}catch{return null}}(n);if(!t)return void console.warn("[GIT] No PAT user metadata found, skipping git config");const s=t.username,a=t.email||`${t.username}@gitlab.local`;await async function(e,n,t){await ws("git",["config","user.name",n],{cwd:e}),await ws("git",["config","user.email",t],{cwd:e})}(e,s,a),console.log(`[GIT] Set local git config user.name=${s} user.email=${a}`)}async function Bs(e,n,t,s){const a=await Fs(s);a?await async function(e,n,t,s=!1){const a=Gs();try{const i=["-c","credential.helper=","push","origin",t];s&&i.push("--force"),await ws("git",i,{cwd:n,env:Ls(a,e)})}finally{f(a)}}(a,e,n,t):await async function(e,n,t=!1){const s=Qe(e),a=t?["--force"]:[];await s.push("origin",n,a)}(e,n,t)}async function Ks(e,n,t){await async function(e){const n=Qe(e);await n.init()}(e);const s=function(e,n){return{hook_event_name:"RepositoryInit",workspace_path:e,task_id:n}}(e,n);return t?.onRepositoryInit&&await t.onRepositoryInit(s),await Is(e),await Es(e)}async function Vs(e,n,t){const s=t.trim();if(!s)return;const a=oe.resolveDataDir(e,n),i=b(a,"patch.diff");return await en(a,{recursive:!0}),await nn(i,`${s}\n`),i}async function Xs(e,n,t){await oe.writeLastSentArtifactVersion(e,n,t)}function Ys(e,n){return`Please generate pull request metadata for the changes made in this task.\n\nInitial commit hash: ${e}\n${n?`\n\nAdditional instructions:\n${n}`:""}\n\nProvide a concise title (conventional commits format), a detailed description, and a user-facing summary message.`}function Js(e,n,t,s=6e4){return new Promise(a=>{const i=`shell_${sn().replace(/-/g,"")}`;t.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=Ce("/bin/bash",["-c",e],{cwd:n,env:process.env,shell:!1});let r=null,c=!1;s>0&&(r=setTimeout(()=>{c=!0,o.kill("SIGTERM"),setTimeout(()=>{o.killed||o.kill("SIGKILL")},1e3)},s));let p="";o.stdout?.on("data",e=>{p+=e.toString()}),o.stderr?.on("data",e=>{p+=e.toString()}),o.on("close",(e,n)=>{let o,l,d;if(r&&clearTimeout(r),c){o=124,d=!0;const e=`\n[Command timed out after ${s/1e3} seconds]`;l=p?`${p}${e}`:e.trim()}else o=null!==e?e:"SIGTERM"===n?143:1,d=0!==o,l=p||"(no output)";t.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:""}),t.onComplete(o),a(o)}),o.on("error",e=>{r&&clearTimeout(r);const n=`[Error] ${e.message||"Command execution failed"}`;t.onOutput({type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:i,content:n,is_error:!0}]},parent_tool_use_id:null,session_id:""}),t.onComplete(1),a(1)})})}class Qs{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 n=("string"==typeof e.message.content?e.message.content:"").trim();return n.startsWith("!")&&!n.startsWith("![")?{type:"bash-command",content:n.slice(1).trim(),originalMessage:e}:"![merge-request]"===n?{type:"merge-request",content:n,originalMessage:e}:"![merge-pr]"===n?{type:"merge-pr",content:n,originalMessage:e}:"![new]"===n?{type:"new-session",content:n,originalMessage:e}:"![plan]"===n?{type:"plan-mode",content:n,originalMessage:e}:{type:"normal",content:n,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 n=this.parseMessage(e),t={id:"msg-"+ ++this.messageIdCounter,type:n.type,priority:"normal",content:n.content,originalMessage:e,timestamp:Date.now()};this.messageQueue.push(t),this.log("info","COORDINATOR",`Enqueued message ${t.id} (type: ${t.type}, queue: ${this.messageQueue.length})`),this.tryUpdateWorkerState(),this.tryProcessNext()}async tryProcessNext(){if(!this.isStopped)if(0!==this.messageQueue.length)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.tryUpdateWorkerState(),this.isStopped||this.tryProcessNext()}else this.tryUpdateWorkerState()}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;case"plan-mode":await this.processPlanMode(e);break;default:this.log("warn","COORDINATOR",`Unknown message type: ${e.type}`)}}finally{if("normal"!==e.type){const n=e.originalMessage.__localSequence;void 0!==n&&this.config.onCommandMessageProcessed?.(n)}}}async processNormalMessage(e){this.log("info","COORDINATOR","Processing normal message for SDK");const n=await this.config.handlers.onNormalMessage(e.originalMessage);this.enqueueAgentMessage(n)}async processBashCommand(e){this.log("info","COORDINATOR",`Processing bash command: ${e.content}`),await this.processCommand(async()=>{await this.config.handlers.onBashCommand(e.content,e.originalMessage)})}async processMergeRequest(e){this.log("info","COORDINATOR","Processing merge-request command"),await this.processCommand(async()=>{await this.config.handlers.onMergeRequest(e.originalMessage)})}async processMergePr(e){this.log("info","COORDINATOR","Processing merge-pr command"),await this.processCommand(async()=>{await this.config.handlers.onMergePr()})}async processNewSession(e){this.log("info","COORDINATOR","Processing new-session command"),await this.processCommand(async()=>{await(this.config.handlers.onNewSession?.())})}async processPlanMode(e){this.log("info","COORDINATOR","Processing plan-mode command"),await this.processCommand(async()=>{if(!this.config.handlers.onPlanMode)return;const n=await this.config.handlers.onPlanMode(e.originalMessage);n&&this.enqueueAgentMessage(n)})}async processCommand(e){await this.waitWorkerIdle(),this.setCommandRunning(!0);try{await e()}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 n=this.workerState;if(this.log("info","COORDINATOR",`Worker state: ${n} → ${e}`),this.workerState=e,"running"===e&&"idle"===n&&(this.runStartTime=Date.now(),this.config.workClient.sendWorkRunning(this.getActiveAgents()),this.lastActiveAgentsSignature=this.getActiveAgentsSignature(),this.clearIdleTimer()),"idle"===e&&"running"===n){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,n,t){const s="running"===this.workerState,a=this.lastActiveAgentsSignature;t?this.agentRunningMap.set(e,{agentId:e,agentName:n,startedAt:Date.now()}):this.agentRunningMap.delete(e);const i=this.getActiveAgentsSignature();this.lastActiveAgentsSignature=i,this.tryUpdateWorkerState(),s&&"running"===this.workerState&&i!==a&&this.config.workClient.sendWorkRunning(this.getActiveAgents())}setBackgroundTaskRunning(e,n){e&&(n?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:n})=>({agentId:e,agentName:n}))}getActiveAgentsSignature(){const e=this.getActiveAgents().slice().sort((e,n)=>e.agentId.localeCompare(n.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,n=this.hasExecutionWork(),t=!e&&!n;this.setWorkerState(t?"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,n,t){this.config.logger&&this.config.logger(e,n,t)}}function Zs(e,n){const t={type:"assistant",session_id:"",uuid:crypto.randomUUID(),parent_tool_use_id:null,message:{role:"assistant",content:[{type:"text",text:n}]}};e.sendTaskMessage(zt,t)}async function ea(e){const{workingDirectory:n,workClient:t,repositoryId:s,gitServerId:a,logger:i,askUser:o,commitChanges:r}=e;if(i.info("[MERGE-PR] Executing merge-pr command"),s){try{const e=await Os(n),s=await Ts(n),c=await async function(e,n){const t=Qe(e);try{return(await t.log([`origin/${n}..HEAD`])).total>0}catch{return!0}}(n,e);if(s||c){const p=await async function(e,n,t,s){let a="";a=e&&n?"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:a,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 t(i)).answers[0];return e.startsWith("other:")?(s.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 s.error("[MERGE-PR] Ask user failed:",e),"Pause"}}(s,c,o,i);if("Pause"===p)return void Zs(t,"Operation paused. Please handle git state and run merge again.");if(("Push"===p||"PushAndMerge"===p)&&(s&&(i.info("[MERGE-PR] Generating commit message with agent"),await r(),i.info("[MERGE-PR] Committed changes with agent-generated message")),i.info(`[MERGE-PR] Pushing branch ${e} to remote`),await Bs(n,e,!1,a),"Push"===p))return void Zs(t,"✅ All changes pushed to remote. You can now review and run merge again if everything looks good.")}const p=await t.sendMergePr();if(p.success)Zs(t,`✅ PR merged successfully! Branch ${e} has been merged into the target branch.`);else{let e;switch(p.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: ${p.error||"Unknown error"}`;break;default:e=`Failed to merge PR: ${p.error||"Unknown error"}`}t.sendSystemErrorMessage(e)}}catch(e){i.error("[MERGE-PR] Failed:",e);const n=e instanceof Error?e.message:"Unknown error";t.sendSystemErrorMessage(`Failed to push or merge: ${n}`)}i.info("[MERGE-PR] Worker ready after merge-pr execution")}else t.sendSystemErrorMessage("Cannot merge: task has no git repository configured.")}function na(e,n){const t=e.updates?.repositoryId;return"string"==typeof t&&0!==t.length&&n.repositoryId!==t&&(n.repositoryId=t,oe.writeTaskInput(n),!0)}function ta(e,n,t,s={}){const a=t.sendAskUser(e),i=s.timeoutMs??18e5,o=s.onTimeout;return new Promise((e,s)=>{const r=setTimeout(()=>{n.delete(a);const i={type:"ask_user_response",answers:[],status:"timeout",reason:"timeout"};t.sendAskUserResponse(a,i),"abort_task"===o?(t.onTimeoutMessage?.("ask_user timed out. Task cancelled."),t.stopTask?.("ask_user_timeout"),s(new Error("Ask user request timed out"))):e(i)},i);n.set(a,n=>{clearTimeout(r),e(function(e){const n=e.status??"answered";return e.status&&e.reason?e:{...e,status:n,reason:e.reason??("timeout"===n?"timeout":"user")}}(n))})})}function sa(e){const n=e.split("\n");for(;n.length>0&&""===n[0].trim();)n.shift();for(;n.length>0&&""===n[n.length-1].trim();)n.pop();const t=n.reduce((e,n)=>{if(""===n.trim())return e;const t=n.match(/^\s*/)[0].length;return Math.min(e,t)},1/0);return n.map(e=>e.slice(t)).join("\n")}const aa=sa("\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"),ia=sa('\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'),oa=sa('\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'),ra=sa('\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'),ca=sa("\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"),pa=sa(`\n ${ra}\n\n ${ia}\n\n ${oa}\n`),la=sa('\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 da(e){const n=["# Available Agents",""];for(const t of e)t.description?n.push(`- **${t.name}** (${t.id}): ${t.description}`):n.push(`- **${t.name}** (${t.id})`);return n.join("\n")}function ua(e,n){const t=n.find(n=>n.id===e);if(!t)return da(n);const s=n.filter(n=>n.id!==e),a=["# Group Context","",`You are \`${t.name}\`. `,"You are a member of this group chat."];if(t.description&&a.push(`Your role: ${t.description}`),s.length>0){a.push(""),a.push("## Other Agents in This Group"),a.push("");for(const e of s)e.description?a.push(`- **${e.name}**: ${e.description}`):a.push(`- **${e.name}**`)}return a.push(""),a.push(la),a.join("\n")}function ma(e){const n={};for(const[t,s]of Object.entries(e))"string"==typeof s&&(n[t]=s);return n}function ga(e){if("object"!=typeof e||null===e)return!1;const n=e;return"text"===n.type&&"string"==typeof n.text}function ha(e){return{type:"user",message:{role:"user",content:e},parent_tool_use_id:null,session_id:""}}function fa(e){const n=e.message?.content;return"string"==typeof n?n:Array.isArray(n)?n.filter(ga).map(e=>e.text).join("\n").trim():""}function xa(e){const n=e.usage.input_tokens-e.usage.cached_input_tokens,t={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:t,modelUsage:{[e.model]:{inputTokens:n>0?n: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 va="agentrix",ba="1.0.0";async function*ya(e){yield e}let wa;const ka=["Bash","Glob","Grep","ExitPlanMode","Read","Skill","SlashCommand","EnterPlanMode"],Ia=["Glob","Grep","Read","Skill"],Sa=["Read","Glob","Grep"],Ta=["Read","Glob","Grep","TodoWrite"];function Ea(e,n,t,s,a,i,o){const c=function(e){const{agentId:n,modeConfig:t,cwd:s,agentConfig:a}=e,{mode:i,groupAgents:o}=t,r=a.customSystemPrompt,c=a.systemPromptMode??"append",p=function(e){const{mode:n,supportChangeTitle:t}=e;switch(n){case"work":return t?aa:void 0;case"companion_shadow":case"companion_chat":case"reply":case"group_chat":return;case"chat":return ca;case"group_work":{const e=[];return t&&e.push(aa),e.join("\n\n")}}}(t);if("group_chat"===i||"group_work"===i){const e=[pa];return o&&o.length>0&&e.push(da(o)),p&&e.push(p),e.join("\n\n")}const l="reply"===i&&o&&o.length>0?ua(n,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?an(r,s,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}}({agentId:e,modeConfig:n.modeConfig,cwd:n.cwd,agentConfig:t}),p=function(e){switch(e){case"work":case"companion_shadow":return;case"chat":case"companion_chat":return[...ka];case"reply":return[...Ia];case"group_chat":return[...Sa];case"group_work":return[...Ta]}}(n.modeConfig.mode),l=function(e,n){const t={},s=e=>async(n,t,s)=>await e(n,t,s)??{},a=new Set([...Object.keys(e),...n?Object.keys(n):[]]);for(const i of a){const a=[],o=e[i];o&&a.push(s(o));const r=n?.[i];r&&a.push(s(r)),t[i]=[{hooks:a}]}return t}(n.hooks??{},s),d=function(){if(void 0!==wa)return wa??void 0;const e=process.env.AGENTRIX_CLAUDE_PATH?.trim();if(e){const n=function(e){const n=e.trim();if(n){if(n.includes("/")||n.includes("\\")||n.startsWith(".")){const e=T(n)?n:E(n);return r(e)?e:void 0}return function(e){const n="win32"===process.platform?"where":"which",t=je(n,[e],{encoding:"utf-8"});if(0===t.status)return t.stdout.split(/\r?\n/).map(e=>e.trim()).find(e=>e.length>0)}(n)}}(e);if(n)return wa=n,n}wa=null}(),u=i?function(e){const{modeConfig:n,tools:t,serverName:s=va,serverVersion:a=ba}=e,{mode:i,supportChangeTitle:o}=n,r=[];switch(i){case"work":o&&r.push(t.changeTaskTitle),r.push(t.askUser),r.push(t.getTaskHistory);break;case"chat":r.push(t.createTask),r.push(t.replyToSubTask),r.push(t.askUser),r.push(t.getTaskHistory),r.push(t.listSubTask);break;case"group_chat":r.push(t.invoke),r.push(t.createSoloTask),r.push(t.createGroupTask),r.push(t.replyToSubTask),r.push(t.getTaskAgents),r.push(t.getTaskHistory);break;case"group_work":r.push(t.invoke),r.push(t.assign),o&&r.push(t.changeTaskTitle),r.push(t.getTaskAgents),r.push(t.getTaskHistory);break;case"reply":r.push(t.getTaskHistory),r.push(t.askUser);break;case"companion_chat":r.push(t.createTask),r.push(t.replyToSubTask),r.push(t.askUser),r.push(t.getTaskHistory),r.push(t.uploadFile),r.push(t.listAgents);break;case"companion_shadow":r.push(t.getTaskHistory),r.push(t.readConversation),r.push(t.listAgents)}("companion_chat"===i||"companion_shadow"===i)&&(r.push(t.listTasks),r.push(t.updateAgentInfo),r.push(t.sendReminder));const c=Xe({name:s,version:a,tools:r}),p=r.map(e=>((e,n)=>`mcp__${e}__${n}`)(s,e.name));return{server:c,toolNames:p}}({modeConfig:n.modeConfig,tools:i}):void 0,m={...u?.server?{agentrix:u.server}:{},...n.mcpServers??{},...a??{}};return{stderr:n.stderr,model:t.customModel||n.model,fallbackModel:t.customFallbackModel,cwd:n.cwd,resume:n.agentSessionId,permissionMode:n.initialPermissionMode??t.customPermissionMode??"bypassPermissions",settingSources:["user","project","local"],systemPrompt:c,tools:p,mcpServers:m,plugins:t.customPlugins,abortController:n.abortController,env:n.env?ma(n.env):void 0,pathToClaudeCodeExecutable:d,maxTurns:t.customMaxTurns??n.maxTurns??o,extraArgs:t.customExtraArgs,canUseTool:n.canUseTool,hooks:l,outputFormat:n.structuredOutputSchema}}class Ca{constructor(e,n,t,s){this.agentId=e,this.agentConfig=n,this.agentHooks=t,this.agentMcpServers=s}getAgentConfiguration(){return this.agentConfig}getHooks(){return this.agentHooks}getMcpServers(){return this.agentMcpServers}async executeHook(e,n,t){await async function(e,n,t,s){if(!e)return;const a=e[n];if(!a)return;const i=s||(e=>console.log(e));try{i(`[${n}] Executing hook...`);const e=new AbortController,s=setTimeout(()=>{e.abort()},6e4);try{await a(t,"",{signal:e.signal}),i(`[${n}] Hook executed successfully`)}finally{clearTimeout(s)}}catch(e){console.warn(`[${n}] Hook failed (non-fatal):`,e)}}(this.agentHooks,e,n,t)}async run(e,n){const t=this.agentConfig,s="string"==typeof e?ha(e):e;let a=null;const i=Ye({prompt:ya(s),options:Ea(this.agentId,n,t,this.agentHooks,this.agentMcpServers,n.agentrixTools)});for await(const e of i)if(console.log("ClaudeRunner.run: received message",JSON.stringify(e)),"result"===e.type){a=e;break}if(!a)throw new Error("ClaudeRunner.run: missing result message");return a}async*runStreamed(e,n){const t=this.agentConfig,s="string"==typeof e?ha(e):e,a=Ye({prompt:ya(s),options:Ea(this.agentId,n,t,this.agentHooks,this.agentMcpServers,n.agentrixTools)});for await(const e of a)if(yield e,"result"===e.type)break}loop(e){const n=e.abortController,t=this.agentConfig,s=Ea(this.agentId,e,t,this.agentHooks,this.agentMcpServers,e.agentrixTools);let a=!1;const i=[];let o=null,r=null;const c=()=>{if(!a&&(a=!0,o)){const e=o;o=null,e(null)}},p=async function*(){for(;!a&&!n.signal.aborted;){if(i.length>0){yield i.shift();continue}const e=await new Promise(e=>{o=e});if(!e)break;yield e}},l=async function*(){try{const e=Ye({prompt:p(),options:s});r=e;for await(const n of e)yield n}finally{r=null,c()}}();return n.signal.addEventListener("abort",c,{once:!0}),{push:e=>{if(console.log("ClaudeRunner.loop.push:",JSON.stringify(e,null,2)),a)return;const n="string"==typeof e?ha(e):e;if(o){const e=o;return o=null,void e(n)}i.push(n)},events:l,setPermissionMode:async e=>{r&&await r.setPermissionMode(e)}}}}function Aa(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:se(),session_id:e.sessionId}}function Ma(e,n){const t=se();return n.set(e,t),t}function _a(e,n){return n.get(e)||e}function Pa(e,n){return"thread.started"===e.type||"turn.started"===e.type||"turn.completed"===e.type||"turn.failed"===e.type?null:"item.started"===e.type?function(e,n){switch(e.type){case"command_execution":return function(e,n){return{type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:Ma(e.id,n),name:"Bash",input:{command:e.command}}]},parent_tool_use_id:null,session_id:""}}(e,n);case"file_change":return function(e,n){return{type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:Ma(e.id,n),name:"Edit",input:{changes:e.changes.map(e=>({kind:e.kind,path:e.path}))}}]},parent_tool_use_id:null,session_id:""}}(e,n);case"mcp_tool_call":return function(e,n){return{type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:Ma(e.id,n),server_name:e.server,name:e.tool,input:e.arguments}]},parent_tool_use_id:null,session_id:""}}(e,n);case"web_search":return function(e,n){return{type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:Ma(e.id,n),name:"web_search",input:{query:e.query}}]},parent_tool_use_id:null,session_id:""}}(e,n);default:return null}}(e.item,n):"item.completed"===e.type?function(e,n){switch(e.type){case"agent_message":return function(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:se().toString()}}(e);case"reasoning":default:return null;case"command_execution":return function(e,n){return{type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:_a(e.id,n),content:"failed"===e.status?"Command execution failed":e.aggregated_output||""}]},parent_tool_use_id:null,session_id:""}}(e,n);case"file_change":return function(e,n){const t=n.get(e.id),s=t??Ma(e.id,n),a=!t;(e.changes||[]).map(e=>`${e.kind}: ${e.path}`);const i={type:"assistant",message:{role:"assistant",content:[{type:"tool_use",id:s,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:s,content:"failed"===e.status?"File changes failed":"File changes completed"}]},parent_tool_use_id:null,session_id:""};return a?[i,o]:o}(e,n);case"mcp_tool_call":return function(e,n){const t=_a(e.id,n),s="failed"===e.status&&e.error;return{type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:t,is_error:s,content:s?e.error.message:e.result?.content||""}]},parent_tool_use_id:null,session_id:""}}(e,n);case"web_search":return function(e,n){return{type:"user",message:{role:"user",content:[{type:"tool_result",tool_use_id:_a(e.id,n),content:{type:"web_search_result",results:[]}}]},parent_tool_use_id:null,session_id:""}}(e,n);case"todo_list":return function(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:""}}(e);case"error":return function(e){return{type:"assistant",message:{role:"assistant",content:`❌ Error: ${e.message}`},parent_tool_use_id:null,session_id:""}}(e)}}(e.item,n):null}let Ra;class $a{createCodex(e){const n={},t=function(){if(void 0!==Ra)return Ra??void 0;const e=process.env.AGENTRIX_CODEX_PATH?.trim();return e?(Ra=e,e):0===je("codex",["--version"],{stdio:"ignore"}).status?(Ra="codex",Ra):void(Ra=null)}();return t&&(n.codexPathOverride=t),e.env&&(n.env=ma(e.env)),new cn(Object.keys(n).length>0?n:void 0)}getAgentConfiguration(){return null}getHooks(){}getMcpServers(){}async executeHook(e,n,t){}async run(e,n){const t=n.abortController,s=this.createCodex(n),a={workingDirectory:n.cwd,model:n.model,sandboxMode:"danger-full-access",approvalPolicy:"never",skipGitRepoCheck:!0},i=n.agentSessionId?s.resumeThread(n.agentSessionId,a):s.startThread(a),o=await i.run("string"==typeof e?e:fa(e),{signal:t.signal,outputSchema:n.structuredOutputSchema?.schema||void 0}),r=i.id??n.agentSessionId??"unknown",c=o.usage??{input_tokens:0,cached_input_tokens:0,output_tokens:0};return xa({sessionId:r,model:n.model??"unknown",numTurns:1,usage:c,result:o.finalResponse??""})}async*runStreamed(e,n){const t=n.abortController,s=this.createCodex(n),a={workingDirectory:n.cwd,model:n.model,sandboxMode:"danger-full-access",approvalPolicy:"never",skipGitRepoCheck:!0},i=n.agentSessionId?s.resumeThread(n.agentSessionId,a):s.startThread(a),{events:o}=await i.runStreamed("string"==typeof e?e:fa(e),{signal:t.signal,outputSchema:n.structuredOutputSchema?.schema||void 0});let r=n.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,n)=>{l.set(e,n)}};for await(const e of o){if("thread.started"===e.type&&(r=e.thread_id,yield Aa({sessionId:r,cwd:n.cwd,model:n.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 n=Pa(e,d);if(!n)continue;const t=Array.isArray(n)?n:[n];for(const e of t)yield e}}const u=xa({sessionId:r,model:n.model??"unknown",numTurns:1,usage:p,result:c});yield u}loop(e){const n=e.abortController,t=this.createCodex(e),s={workingDirectory:e.cwd,model:e.model,sandboxMode:"danger-full-access",approvalPolicy:"never",skipGitRepoCheck:!0};let a=e.agentSessionId?t.resumeThread(e.agentSessionId,s):t.startThread(s),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:fa(e),u=async function*(){try{for(;!i&&!n.signal.aborted;){const t=o.length>0?o.shift():await new Promise(e=>{r=e});if(!t)break;let s="";const l=new Map,u={get:e=>l.get(e),set:(e,n)=>{l.set(e,n)}},{events:m}=await a.runStreamed(d(t),{signal:n.signal,outputSchema:e.structuredOutputSchema?.schema||void 0});for await(const n of m){if(i)break;if("thread.started"!==n.type){if("turn.completed"===n.type){c&&(yield xa({sessionId:c,model:e.model??"unknown",numTurns:p+1,usage:n.usage??{input_tokens:0,cached_input_tokens:0,output_tokens:0},result:s}));break}if("turn.failed"===n.type)throw new Error(n.error.message);if("error"===n.type)throw new Error(n.message);if("item.started"===n.type||"item.completed"===n.type){"item.completed"===n.type&&"agent_message"===n.item.type&&n.item.text&&(s=n.item.text);const e=Pa(n,u);if(!e)continue;const t=Array.isArray(e)?e:[e];for(const e of t)yield e}}else c=n.thread_id,yield Aa({sessionId:c,cwd:e.cwd,model:e.model})}p+=1}}finally{l()}}();return n.signal.addEventListener("abort",l,{once:!0}),{push:e=>{if(console.log("CodexRunner.loop.push:",JSON.stringify(e,null,2)),!i){if(r){const n=r;return r=null,void n(e)}o.push(e)}},events:u}}}function Da(e,n,t){e&&e(n,"AGENT",t)}const Oa=["PreToolUse","PostToolUse","SessionStart","SessionEnd","UserPromptSubmit","Stop","SubagentStop","PreCompact","Notification","RepositoryInit"];function Na(e){const n={};for(const t of Oa){const s=e[t];"function"==typeof s&&(n[t]=s,console.log(`[Hook Loader] ✓ Loaded hook: ${t}`))}const t=Object.keys(n).length;return 0===t?console.warn("[Hook Loader] No valid hooks found in module"):console.log(`[Hook Loader] Successfully loaded ${t} hook(s)`),n}class ja{static pool=new Map;static async create(e,n,t){const s=this.pool.get(n);if(s)return s;let a;if("claude"===e){const e=await async function(e){const{agentId:n,agentDir:t,logger:s}=e;if(!n||"default"===n)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};try{Da(s,"info",`Loading agent: ${n}`);const e=await on({agentId:n,framework:"claude",agentDir:t});if(!e.claude)return Da(s,"warn",`No claude configuration found for agent ${n}`),{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};const a=e.claude,i=a.plugins.map(e=>({type:"local",path:e})),o=t||rn().resolveAgentDir(n),r=a.config.sdkMcpTools?.map(e=>b(o,"claude",e)),c={customSystemPrompt:a.systemPrompt,customModel:a.config.model,customFallbackModel:a.config.fallbackModel,customMaxTurns:a.config.maxTurns,customExtraArgs:a.config.extraArgs,customPermissionMode:a.config.settings?.permissionMode,customPlugins:i,systemPromptMode:a.config.systemPrompt?.mode??"append",customPRPromptTemplate:a.prPromptTemplate,prPromptMode:a.config.pullRequestPrompt?.mode??"append",customSdkMcpTools:r};return Da(s,"info",`Agent ${n} loaded successfully (${i.length} plugins)`),c}catch{return Da(s,"error",`Failed to load agent: ${n}`),{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}}}({agentId:n,agentDir:t?.agentDir,logger:t?.logger});let s,i;t?.context&&n&&"default"!==n&&(s=await async function(e,n,t){if(e&&"default"!==e)try{const s=X(),a=n||s.resolveAgentDir(e),i=b(a,"claude");return await async function(e,n){const t=we(e,"hooks");if(!xe(t))return{};const s=[we(t,"dist","index.mjs"),we(t,"dist","index.js"),we(t,"index.mjs"),we(t,"index.js")];let a=null;for(const e of s)if(xe(e)){a=e;break}if(!a)return console.warn(`[Hook Loader] Hooks not built: ${t}`),console.warn("[Hook Loader] To build hooks, run:"),console.warn(`[Hook Loader] cd ${t}`),console.warn("[Hook Loader] npm install && npm run build"),console.warn("[Hook Loader] Or place hooks directly in:"),console.warn(`[Hook Loader] ${we(t,"index.js")} or ${we(t,"index.mjs")}`),{};try{console.log(`[Hook Loader] Loading hooks: ${a}`);const e=`${He(a).href}?t=${Date.now()}`,t=await import(e);if("function"==typeof t.default){if(n)return console.log("[Hook Loader] Using factory pattern with AgentrixContext"),Na(t.default(n));console.warn("[Hook Loader] Factory function found but no context provided, skipping factory")}return Na(t)}catch(e){throw console.error(`[Hook Loader] Failed to load hooks from ${a}:`,e),new Error(`Hook loading failed: ${e instanceof Error?e.message:String(e)}`)}}(i,t)}catch(e){return void console.warn("[AgentRunners] Failed to load hooks:",e)}}(n,t.agentDir,t.context)),t?.context&&e.customSdkMcpTools&&e.customSdkMcpTools.length>0&&(i=await async function(e,n,t){const s={};for(const a of e)try{t&&t("info","MCP",`Loading SDK MCP tools from: ${a}`);const e=await import(a),i=e.default||e;if(!i){t&&t("warn","MCP",`No default export found in ${a}`);continue}const o="function"==typeof i?i(n):i,r=o.name;s[r]=o,t&&t("info","MCP",`Loaded MCP server: ${r}`)}catch(e){t&&t("error","MCP",`Failed to load SDK MCP tools from ${a}: ${e instanceof Error?e.message:String(e)}`)}return s}(e.customSdkMcpTools,t.context,t.logger)),a=new Ca(n,e,s,i)}else a=new $a;return this.pool.set(n,a),a}static release(e){this.pool.delete(e)}static releaseAll(){this.pool.clear()}}class qa{constructor(e){this.workingDirectory=e}async listFiles(e=3){const n=[];return this.listFilesRecursively(this.workingDirectory,n,"",e,0),n}async readFile(e){try{const n=be.join(this.workingDirectory,e);return ge.existsSync(n)?ge.readFileSync(n,"utf-8"):null}catch{return null}}async fileExists(e){const n=be.join(this.workingDirectory,e);return ge.existsSync(n)}listFilesRecursively(e,n,t,s,a){if(!(a>s))try{const i=ge.readdirSync(e,{withFileTypes:!0});for(const o of i){const i=t?`${t}/${o.name}`:o.name;o.isDirectory()?J.includes(o.name)||this.listFilesRecursively(be.join(e,o.name),n,i,s,a+1):o.isFile()&&n.push(i)}}catch(e){}}}class Ua{constructor(e){this.params=e}state=null;async setup(){const{options:e,handlers:n}=this.params,{userId:t,taskId:s,cwd:a}=e;if(!a)throw new Error("[WORKSPACE] Missing cwd for workspace setup");const i=oe.getWorkspaceState(t,s),o=e.repositorySourceType,r={...e,repositorySourceType:o},{initialCommitHash:c,isGitRepository:p,initPolicyUpdates:l}=await this.ensureWorkspace(r,n,i);await oe.writeWorkspaceState(t,s,{initialized:!0,initializedAt:(new Date).toISOString(),cwd:a,repositorySourceType:r.repositorySourceType,userCwd:e.userCwd,forceUserCwd:e.forceUserCwd,gitUrl:e.gitUrl,baseBranch:e.baseBranch,taskRepositoryId:e.taskRepositoryId,initialCommitHash:c,initPolicies:{...i?.initPolicies,...l}});const d=await async function(e,n,t,s){return async function(e,n,t,s){if(!await ks(e))return{currentCommitHash:"",hadUncommittedChanges:!1,hasNewArtifacts:!1,lastSentArtifactVersion:void 0,patchPath:"",diffStats:void 0};const a=await Ts(e),i=await Es(e),o=s||oe.getWorkspaceState(n,t)?.initialCommitHash;if(!o)throw new Error(`Initial commit hash not found for task ${t}`);const r=await Ds(e,o),c=r?await Vs(n,t,r.patch):void 0,p=await oe.readLastSentArtifactVersion(n,t),l=!!r&&r.artifactVersion!==p;return{currentCommitHash:i,currentArtifactVersion:r?.artifactVersion,hadUncommittedChanges:a,hasNewArtifacts:l,lastSentArtifactVersion:p??void 0,patchPath:c,diffStats:r?.stats}}(e,n,t,s)}(a,t,s,c);return this.state={cwd:a,initialCommitHash:c,isGitRepository:p,gitStateResult:d},p&&!e.taskRepositoryId&&await async function(e,n){try{const t=await async function(e){try{const n=Qe(e),t=(await n.getRemotes(!0)).find(e=>"origin"===e.name);if(!t?.refs?.fetch)return null;const s=t.refs.fetch,a=s.match(/^git@([^:]+):(.+)\/(.+?)(?:\.git)?$/);if(a){const[,e,n,t]=a;return{url:s,host:e.split("-")[0],owner:n,repo:t}}const i=s.match(/^https?:\/\/([^/]+)\/(.+)\/(.+?)(?:\.git)?$/);if(i){const[,e,n,t]=i;return{url:s,host:e,owner:n,repo:t}}return null}catch(e){return console.error("[GIT] Failed to get remote info:",e),null}}(e);if(!t)return void console.log("[REPO] No origin remote found, skipping repository association");if(!n?.onRepositoryDetected)return;console.log(`[REPO] Detected remote: ${t.host}/${t.owner}/${t.repo}`),n.onRepositoryDetected(t)}catch(e){console.error("[REPO] Failed to send repository association:",e)}}(a,n),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:n,initialCommitHash:t,isGitRepository:s}=this.getState(),{userId:a,taskId:i}=this.params.options;if(!s||!t)return{};const o=await Ds(n,t);if(!o)return{};try{await Vs(a,i,o.patch)}catch(n){e.onPatchError?.(n)}const r=await async function(e){const n=new qa(e);return Y(n)}(n),c=await oe.readLastSentArtifactVersion(a,i);return c&&c===o.artifactVersion?{artifactVersion:o.artifactVersion}:{artifactVersion:o.artifactVersion,artifacts:{artifactVersion:o.artifactVersion,stats:o.stats,preview:r}}}async ensureWorkspace(e,n,t){const s=e.repositorySourceType;return"git-server"===s?this.ensureGitServerWorkspace(e,n,t):"directory"===s?this.ensureDirectoryWorkspace(e,n,t):this.ensureTemporaryWorkspace(e,n,t)}async ensureGitServerWorkspace(e,n,t){const{cwd:s,gitUrl:a,taskId:i,baseBranch:o,branchName:c,gitServerId:p}=e;if(!a)throw new Error("[WORKSPACE] gitUrl is required for git-server mode");const l=await ks(s),d=As(s);if(!l){if(!d)throw new Error(`[WORKSPACE] Directory ${s} exists but is not a git repository.`);const e=await async function(e,n,t,s,a,i){const o=Hs(t,i),c=await ks(e);if(!As(e)&&!c)throw new Error(`Directory ${e} exists but is not a git repository`);const p=await Fs(a);return As(e)?(p?(console.log("[GIT] Using GIT_ASKPASS credential injection for clone"),await async function(e,n,t){const s=y(t);r(s)||g(s,{recursive:!0});const a=Gs();try{await ws("git",["-c","credential.helper=","clone",n,t],{env:Ls(a,e)})}finally{f(a)}}(p,n,e),a&&await zs(e,a)):await async function(e,n){const t=y(n);r(t)||g(t,{recursive:!0});const s=Qe();await s.clone(e,n)}(n,e),await Ss(e,o,s),await Es(e)):(await Ns(e,"origin",n),p&&(console.log("[GIT] Using GIT_ASKPASS credential injection for fetch"),await async function(e,n){const t=Gs();try{await ws("git",["-c","credential.helper=","fetch","origin"],{cwd:n,env:Ls(t,e)})}finally{f(t)}}(p,e),a&&await zs(e,a)),await Ss(e,o,s),await Es(e))}(s,a,i,o,p,c)||await Es(s);return{initialCommitHash:this.resolveInitialCommitHash(t?.initialCommitHash,e,"none"),isGitRepository:!0,autoCommitPolicy:"enabled"}}return await Ns(s,"origin",a),this.tryResolveDirtyRepo(e,n,t)}async ensureDirectoryWorkspace(e,n,t){const{cwd:s,taskId:i,userCwd:o}=e;if(await ks(s))return this.tryResolveDirtyRepo(e,n,t);if(!As(s))return{initialCommitHash:"",isGitRepository:!1,autoCommitPolicy:"enabled"};{if(!o)return{initialCommitHash:"",isGitRepository:!1,autoCommitPolicy:"enabled"};const n=o.replace(/^~/,a());if(As(n))return{initialCommitHash:"",isGitRepository:!1,autoCommitPolicy:"enabled"};if(!await ks(n))return{initialCommitHash:"",isGitRepository:!1,autoCommitPolicy:"enabled"};await Cs(n)||await Is(n),await async function(e,n,t,s){const i=e.replace(/^~/,a());if(!await ks(i))throw new Error(`Directory ${i} is not a git repository. Worktrees can only be created from existing git repositories.`);if(!await Cs(i))throw new Error(`Cannot create worktree: repository at ${i} has no commits. Please create an initial commit first: cd ${i} && git add . && git commit -m 'Initial commit'`);const o=Hs(t,s),c=(await async function(e){const n=Qe(e),t=(await n.raw(["worktree","list","--porcelain"])).trim().split("\n").filter(Boolean),s=[];let a=null;for(const e of t)if(e.startsWith("worktree "))a&&s.push(a),a={path:e.replace("worktree ","").trim(),branch:null,commit:"",isMain:0===s.length};else if(a)if(e.startsWith("HEAD "))a.commit=e.replace("HEAD ","").trim();else{if(e.startsWith("branch ")){const n=e.replace("branch ","").trim();a.branch=n.replace("refs/heads/","");continue}e.startsWith("detached")&&(a.branch=null)}return a&&s.push(a),s}(i)).find(e=>e.path===n);if(c){if(c.branch&&c.branch!==o)throw new Error(`Worktree at ${n} is already attached to branch ${c.branch}. Remove it before retrying: git worktree remove ${n}`);return{initialCommitHash:await Es(n)}}const p=Qe(i),l=(await p.branchLocal()).all.includes(o);if(r(n)&&!As(n))throw new Error(`Worktree directory already exists at ${n}. This may be from a previous task. To clean up: git worktree remove ${n} OR rm -rf ${n}`);try{l?await p.raw(["worktree","add",n,o]):await async function(e,n,t,s="HEAD"){const a=y(n);if(r(a)||g(a,{recursive:!0}),r(n)&&!As(n))throw new Error(`Worktree directory already exists at ${n}`);const i=Qe(e);await i.raw(["worktree","add","-b",t,n,s])}(i,n,o,"HEAD")}catch(e){try{await async function(e,n,t=!1){const s=Qe(e),a=["worktree","remove"];t&&a.push("--force"),a.push(n),await s.raw(a)}(i,n,!0)}catch{}throw e}return{initialCommitHash:await Es(n)}}(n,s,i,e.branchName)}return this.tryResolveDirtyRepo(e,n,t)}async ensureTemporaryWorkspace(e,n,t){const{cwd:s,taskId:a}=e;if(!await ks(s)){await async function(e,n,t){return{initialCommitHash:await Ks(e,n,t)}}(s,a,n),await Ss(s,Hs(a,e.branchName),e.baseBranch);const i=await Es(s);return{initialCommitHash:this.resolveInitialCommitHash(t?.initialCommitHash,i,"none"),isGitRepository:!0,autoCommitPolicy:"enabled"}}return this.tryResolveDirtyRepo(e,n,t)}async tryResolveDirtyRepo(e,n,t){let s=null,a="enabled";const i={};if(await async function(e){return!!await ks(e)&&await Ts(e)}(e.cwd)){const o=this.getPersistedInitPolicy(t,"uncommittedChanges",["Ignore","Commit","Stash"]),r=o?{action:o,remember:!0}:n?.onUncommittedChanges?await n.onUncommittedChanges():{action:"Ignore",remember:!1},c=r.action;if(await async function(e,n){switch(n){case"Ignore":console.log("[GIT] User chose to ignore uncommitted changes");break;case"Stash":console.log("[GIT] Stashing uncommitted changes"),await async function(e){const n=Qe(e);await n.stash(["push"])}(e);break;case"Commit":console.log("[GIT] Committing uncommitted changes with agent-generated message");break;case"Abort":throw new Error("Task aborted by user due to uncommitted changes")}}(e.cwd,c),"Abort"===c)throw new Error("Task aborted by user due to uncommitted changes");if("Commit"===c){if(!n?.onCommitUncommittedChanges)throw new Error("Unable to commit uncommitted changes during workspace setup");await n.onCommitUncommittedChanges()}!o&&r.remember&&(i.uncommittedChanges=c),s=c,"Ignore"===c&&(a="disabled_by_ignore")}let o;if(await Cs(e.cwd)||await Is(e.cwd),"Ignore"===s){const n=Hs(e.taskId,e.branchName);o=await Os(e.cwd)===n?"none":"kept"}else o=await this.tryResolveBranchMismatch(e,n,t,i);const r=await Es(e.cwd);return{initialCommitHash:this.resolveInitialCommitHash(t?.initialCommitHash,r,o),isGitRepository:!0,autoCommitPolicy:a,initPolicyUpdates:i}}getPersistedInitPolicy(e,n,t){const s=e?.initPolicies?.[n];return s&&t.includes(s)?s:null}resolveInitialCommitHash(e,n,t){return e?"kept"===t?n:e:n}async tryResolveBranchMismatch(e,n,t,s){const a=Hs(e.taskId,e.branchName),i=await Os(e.cwd);if(i===a)return"none";const o=this.getPersistedInitPolicy(t,"branchMismatch",["Switch","Keep"]),r=o?{action:o,remember:!0}:n?.onBranchMismatch?await n.onBranchMismatch({currentBranch:i,expectedBranch:a,workingDirectory:e.cwd}):{action:"Switch",remember:!1};if("Abort"===r.action)throw new Error("Task aborted by user due to branch mismatch");return!o&&r.remember&&(s.branchMismatch=r.action),"Keep"===r.action?"kept":(await Ss(e.cwd,a,e.baseBranch),"switched")}}const Ga=$e.object({title:$e.string().describe("Concise PR title following conventional commits format (feat/fix/docs/refactor/test/chore: description), maximum 50 characters"),description:$e.string().describe("Detailed PR description explaining: what changed, why these changes were necessary, any important technical decisions, and impact on existing functionality"),userMessage:$e.string().describe("Friendly message to display to the user, summarizing the PR creation. Should be concise and informative.")}),La=De(Ga,{target:"draft-07"}),Wa=De(Ga);function Ha(e){if("success"!==e.subtype)throw new Error("PR response failed before structured output was returned");const n=e;return n.structured_output?Ga.parse(n.structured_output):function(e){if(!e.trim())throw new Error("PR response was empty");const n=Fa(e),t=JSON.parse(n);return Ga.parse(t)}(n.result??"")}function Fa(e){const n=e.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);return n?n[1].trim():e.trim()}class za{chain=Promise.resolve();run(e){const n=this.chain.then(e,e);return this.chain=n.then(()=>{},()=>{}),n}}const Ba=[{name:"/merge-request",sendAs:"![merge-request]",description:"Create a pull request for current task changes"},{name:"/merge-pr",sendAs:"![merge-pr]",description:"Merge the current pull request"},{name:"/new",sendAs:"![new]",description:"Start a new session for this task"}];function Ka(e){const n=e.trim();return n?n.startsWith("/")?n:`/${n}`:""}function Va(e=[]){const n=[],t=new Set;for(const e of Ba.map(e=>({id:`cli_builtin:${e.name}`,name:e.name,kind:"cli_builtin",sendAs:e.sendAs,description:e.description})))n.push(e),t.add(e.name);const s=Array.from(new Set(e.map(Ka).filter(Boolean)));s.sort((e,n)=>e.localeCompare(n));for(const e of s)t.has(e)||n.push({id:`sdk:${e}`,name:e,kind:"sdk",sendAs:e});return n}const Xa=$e.object({message:$e.string().describe("A git commit message following conventional commits. Return only the commit message text, optionally with a blank line and body.")}),Ya=De(Xa,{target:"draft-07"}),Ja=De(Xa);async function Qa(e){if(!await Ts(e.workingDirectory))throw new Error("No uncommitted changes to commit");const n=await Es(e.workingDirectory),t=await async function(e){const n=e.runner.runStreamed("Generate a git commit message for the current uncommitted changes.\n\nRequirements:\n- Follow this repository's commit message conventions.\n- Keep the subject line specific and concise.\n- Add a body only if it materially improves clarity.\n- Return only the commit message.",{cwd:e.workingDirectory,model:e.model,abortController:e.abortController,modeConfig:e.modeConfig,structuredOutputSchema:{type:"json_schema",schema:"claude"===e.schemaTarget?Ya:Ja}});let t=null;for await(const s of n){if("result"===s.type){t=s;break}await(e.onStreamMessage?.(s))}if(!t)throw new Error("Commit message generation did not return a result message");return function(e){if("success"!==e.subtype)throw new Error("Commit message generation failed before structured output was returned");const n=e,t=(n.structured_output?Xa.parse(n.structured_output):Xa.parse(JSON.parse(Fa(n.result??"")))).message.trim();if(!t)throw new Error("Commit message generation returned an empty message");return t}(t)}(e),s=await async function(e,n){const t=n.trim();if(!t)throw new Error("Commit message cannot be empty");const[s,...a]=t.split(/\n\s*\n/).map(e=>e.trim()).filter(Boolean);if(!s)throw new Error("Commit subject cannot be empty");const i=Qe(e);await i.add(["--all"]);const o=["commit","-m",s];for(const e of a)o.push("-m",e);return await i.raw(o),await Es(e)}(e.workingDirectory,t);if(await Ts(e.workingDirectory))throw new Error("Commit completed but working tree is still dirty");if(s===n)throw new Error("Commit completed but HEAD did not change");return{commitHash:s,message:t}}async function Za(e,n){await o.promises.mkdir(n,{recursive:!0});const t=await o.promises.readdir(e,{withFileTypes:!0});for(const s of t){const t=v.join(e,s.name),a=v.join(n,s.name);s.isDirectory()?await Za(t,a):await o.promises.copyFile(t,a)}}class ei{constructor(e,n,t){this.credentials=e,this.options=n,this.workingDirectory=t;const s=this.options.input,{taskId:a,userId:i}=s;this.logger=le({type:"worker",taskId:a}),this.currentAgentSessionId="agentSessionId"in s?s.agentSessionId:void 0;const o=s.taskAgents||[];this.taskAgentsMap=new Map(o.map(e=>[e.id,e]));const r=this.taskAgentsMap.size>1;this.primaryAgentId=r?"planner":s.agentId,this.primaryAgentName=r?"planner":this.taskAgentsMap.get(s.agentId)?.name??"unknown";const c=this.createWorkerClientConfig(i,a,t),p=oe.resolveDataDir(i,a);this.historyDb=Nt({dataDir:p,taskId:a}),this.workClient=new Bt(c.config,{...c.handlers,getPermissionMode:()=>this.getPermissionModeSnapshot(),historyDb:this.historyDb}),this.coordinator=this.createMessageCoordinator(this.workClient,this.options.idleTimeoutSecond),this.agentContext=new Kt({logger:this.logger,socketClient:this.workClient.client,taskId:s.taskId,userId:s.userId,chatId:s.chatId,rootTaskId:s.rootTaskId||s.taskId,parentTaskId:s.parentTaskId||null,workingDirectory:this.workingDirectory,agentHomeDir:oe.agentrixAgentsHomeDir,taskAgents:s.taskAgents||[],serverUrl:oe.serverUrl,taskDataKey:this.options.dataEncryptionKey}),this.agentrixTools=this.createAgentrixTools();const l={...Ws(this.options.input),cwd:this.workingDirectory};this.workspace=new Ua({options:l,handlers:this.createWorkspaceHandlers(this.workClient)})}abortController=new AbortController;isStopping=!1;askUserAwaiter=new Map;messageFilter=Yt();logger;workClient;workspace;coordinator;agentContext;runner;agentQueues=new Map;currentAgentSessionId;currentGroupId=null;historyDb;chatHistoryDb=null;agentrixTools;pendingNavigateTaskId=null;pendingPermissions=new Map;grantedPermissions=new Set;loopPermissionModeSetter=null;configuredPermissionMode="bypassPermissions";desiredPermissionMode=null;activePermissionMode=null;lastBroadcastPermissionMode=null;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()}getConfiguredPermissionMode(){const e=this.runner?.getAgentConfiguration()?.customPermissionMode;return e??"bypassPermissions"}initializePermissionModeState(){this.configuredPermissionMode=this.getConfiguredPermissionMode(),this.desiredPermissionMode??=this.configuredPermissionMode}getPermissionModeSnapshot(){return this.desiredPermissionMode??this.configuredPermissionMode??null}broadcastPermissionMode(e){this.lastBroadcastPermissionMode!==e&&(this.lastBroadcastPermissionMode=e,this.workClient.sendPermissionMode(e))}confirmPermissionModeApplied(e){this.desiredPermissionMode=e,this.activePermissionMode=e,this.broadcastPermissionMode(e)}async applyPermissionMode(e){this.loopPermissionModeSetter&&(await this.loopPermissionModeSetter(e),this.confirmPermissionModeApplied(e))}async flushDesiredPermissionMode(){const e=this.getPermissionModeSnapshot();e&&this.loopPermissionModeSetter&&this.activePermissionMode!==e&&await this.applyPermissionMode(e)}async requestPermissionMode(e){this.desiredPermissionMode=e,this.broadcastPermissionMode(e),await this.flushDesiredPermissionMode()}async restoreConfiguredPermissionMode(){await this.requestPermissionMode(this.configuredPermissionMode)}shouldProcessMessage(e){const n=e.message,t=this.getRunnerMode(),s="group_chat"===t||"group_work"===t,a=B(n);return!!Q(n)||!!Z(n)||!(!K(n)&&!a)&&(s?"agent"!==e.senderType&&e.senderId!==this.primaryAgentId:!!a||"system"===e.senderType&&"user"===n.type||"user"===n.type)}shouldDropHeartbeatWhileBusy(){return this.coordinator.isActivelyExecuting()}async processPendingMessages(){const e=this.historyDb.pageMessagesAfter(this.lastProcessedSequence,100),n=this.getRunnerMode(),t="group_chat"===n||"group_work"===n,s=[];for(const n of e.data)if(this.lastProcessedSequence=n.localSequence,this.shouldProcessMessage(n)){if(t&&this.isUnsupportedGroupPlanCommand(n)){this.log("info","PLAN","Ignoring unsupported ![plan] command in group mode");continue}s.push(n)}if(s.length>0){this.deduplicateHeartbeats(s);const e=this.mergeConsecutiveHumanMessages(s);t?await this.processMessagesAsGroup(e):await this.processMessagesIndividually(e)}e.hasMore&&await this.processPendingMessages()}isUnsupportedGroupPlanCommand(e){const n=e.message;return!(!K(n)||"user"!==n.type)&&"![plan]"===fa(n).trim()}deduplicateHeartbeats(e){let n=-1;for(let t=e.length-1;t>=0;t--)Q(e[t].message)&&(-1===n?n=t:(e.splice(t,1),n--))}mergeConsecutiveHumanMessages(e){if(0===e.length)return[];const n=[];let t=0;for(;t<e.length;){const s=e[t];if("human"===s.senderType){const a=[s];for(;t+1<e.length;){const n=e[t+1];if("human"!==n.senderType||n.senderId!==s.senderId)break;a.push(n),t++}1===a.length?n.push(s):n.push(this.createMergedHumanMessage(a))}else n.push(s);t++}return n}createMergedHumanMessage(e){const n=[],t=[];for(const s of e){const e=s.message;if(!K(e)||"user"!==e.type)continue;const a=e.message.content;if("string"==typeof a)n.push(a);else if(Array.isArray(a))for(const e of a)"text"===e.type?n.push(e.text):t.push(e)}const s=n.join(""),a=t.length>0?[{type:"text",text:s},...t]:s,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:a},parent_tool_use_id:null,session_id:i.message?.session_id||""}}}async processMessagesAsGroup(e){const n=[],t=[];for(const s of e){const e=Jt(s);if(e){const s=e.message.content;if("string"==typeof s)n.push(s);else if(Array.isArray(s))for(const e of s)"text"===e.type?n.push(e.text):t.push(e)}}if(0===n.length)return;const s=Math.max(...e.map(e=>e.localSequence)),a=n.join(" "),i={type:"user",message:{role:"user",content:t.length>0?[{type:"text",text:a},...t]:a},parent_tool_use_id:null,session_id:""};i.__localSequence=s,await this.coordinator.enqueue(i)}async processMessagesIndividually(e){for(const n of e){const e=this.formatSingleMessage(n);e&&(e.__localSequence=n.localSequence,await this.coordinator.enqueue(e))}}formatSingleMessage(e){const n=e.message;if(Q(n))return{type:"user",message:{role:"user",content:`[heartbeat] You are being awakened by a scheduled heartbeat at ${n.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(Z(n)){const e=n;let t=`[reminder from shadow] ${e.content}`;return e.filePath&&(t+=`\nDetailed analysis: ${e.filePath}`),{type:"user",message:{role:"user",content:t},parent_tool_use_id:null,session_id:""}}return K(n)&&"user"===n.type?n: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(n){if(!(n instanceof Je)){e="error",this.log("warn","AGENT","Fatal error:",n);const t=n instanceof Error?n.message:String(n);await this.reportFatalError(t)}}finally{await this.exitWorker(e)}}async autoInstallAgent(e){const n=this.options.input,t=n.agentGitUrl,s=n.agentGitSubDir;if(t)try{this.log("info","AGENT",`Auto-installing agent ${e} from git`),await Ct({agentId:e,gitUrl:t,subDir:s??void 0})}catch(n){this.log("warn","AGENT",`Auto-install failed for agent ${e}: ${n}`)}else this.log("warn","AGENT",`Auto-install skipped: no agentGitUrl provided for agent ${e}`)}async applyAgentUpgrade(e,n,t){const s=oe.agentrixAgentsHomeDir,a=b(s,`${e}.new`),i=b(s,`${e}-bak`);try{this.log("info","AGENT",`Applying upgrade for ${e}`),At(t),d(t,a),await Za(n,i),u(n,{recursive:!0,force:!0}),d(a,n),xe(i)&&u(i,{recursive:!0,force:!0}),this.log("info","AGENT",`Upgrade applied for ${e}`)}catch(t){this.log("warn","AGENT",`Upgrade failed for ${e}: ${t}`),!xe(n)&&xe(i)&&d(i,n),xe(a)&&u(a,{recursive:!0,force:!0})}}async initialize(){const e=this.options.input,n=oe.resolveAgentDir(e.agentId),t=b(n,"upgrade"),s=Boolean(e.agentId&&"default"!==e.agentId&&!e.agentDir&&!xe(n)),a=Boolean(e.agentId&&"default"!==e.agentId&&!e.agentDir&&!s&&xe(t));await this.workClient.connect(),this.workClient.sendWorkerInitializing({deployingAgent:s,upgradingAgent:a}),s&&await this.autoInstallAgent(e.agentId),a&&await this.applyAgentUpgrade(e.agentId,n,t);const i=await ja.create("claude",e.agentId,{agentDir:e.agentDir,logger:this.log.bind(this),context:this.agentContext});this.runner=i,this.initializePermissionModeState(),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(),this.workClient.sendTaskSlashCommandsUpdate(Va())}createWorkspaceHandlers(e){return{onRepositoryDetected:n=>{e.associateRepository(n.host,n.owner,n.repo,n.url)},onRepositoryInit:async e=>{await(this.runner?.executeHook("RepositoryInit",e))},onUncommittedChanges:this.onUncommittedChanges.bind(this),onCommitUncommittedChanges:this.commitCurrentChangesWithAgent.bind(this),onBranchMismatch:this.onBranchMismatch.bind(this)}}async registerWithDaemon(e){const n=this.options.input.taskId,t=await hn(n,{cwd:e,machineId:this.credentials.machineId,pid:process.pid,startedBy:this.options.startedBy||"terminal"});t.error?this.log("warn","DAEMON",`Failed to report session ${n}:`,t.error):this.log("info","DAEMON",`Session ${n} registered`)}setEnvironmentVariables(){this.options.input.environmentVariables&&Object.entries(this.options.input.environmentVariables).forEach(([e,n])=>{null!=n&&(process.env[e]=String(n))}),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,n){const t=1e3*Math.max(0,n??0);return this.coordinator=new Qs({workerType:"claude",workClient:e,onCommandMessageProcessed:e=>{this.markPrimaryMessageProcessed(e)},handlers:{onNormalMessage:async e=>e,onBashCommand:async(e,n)=>{await this.executeBashCommand(e)},onMergeRequest:async e=>{await this.executeMergeRequest()},onMergePr:async()=>{await this.executeMergePr()},onNewSession:async()=>{await this.executeNewSession()},onPlanMode:async()=>(await this.requestPermissionMode("plan"),null)},logger:(e,n,t)=>{const s=e;this.log(s,n,t)},idleTimeoutMs:t,onIdleTimeout:()=>this.stopTask("idle")}),this.coordinator}handleEvent(){const e=this.options.input.event,n=this.options.input.eventData;if("sub-task-result-updated"===e){const e=n,t=Xt(e,this.options.dataEncryptionKey);this.historyDb.saveMessage({eventId:e.eventId||`sub-task-${Date.now()}`,message:t,senderType:"system",senderId:"system",senderName:"system"})}this.triggerMessageProcessing()}async executeMergeRequest(){this.log("info","MERGE","Executing merge-request command");const e=this.getRunnerMode(),n="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 Ts(this.workingDirectory)&&await this.commitCurrentChangesWithAgent();const e=await Es(this.workingDirectory),a=this.workspace.getInitialCommitHash();if(!a){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 _s(this.workingDirectory,a,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 i=await Os(this.workingDirectory);this.log("info","MERGE",`Pushing branch ${i} to remote`),await Bs(this.workingDirectory,i,!1,this.options.input.gitServerId),this.log("info","MERGE","Successfully pushed branch to remote");const o=this.runner?.getAgentConfiguration(),r=Ys(a,(o?.customPRPromptTemplate?(t=o.customPRPromptTemplate,s={initialCommitHash:a,currentCommitHash:"",branchName:""},t.replace(/\{\{initialCommitHash\}\}/g,s.initialCommitHash).replace(/\{\{currentCommitHash\}\}/g,s.currentCommitHash).replace(/\{\{branchName\}\}/g,s.branchName)):void 0)??void 0);this.log("debug","MERGE",`PR prompt: ${r.substring(0,200)}...`);const c=this.runner;let p=null;const l=c.runStreamed(r,{cwd:this.workingDirectory,model:this.options.input.model,abortController:this.abortController,modeConfig:this.getRunnerModeConfig(),structuredOutputSchema:{type:"json_schema",schema:La}});for await(const e of l){if(this.logger.debug(`sdk message: ${JSON.stringify(e)}`),"result"===e.type){p=e;break}const t=n?e:this.messageFilter.filter(e);null!==t&&this.workClient.sendTaskEvent(this.getChatSenderMeta(),t,{groupId:this.currentGroupId??void 0})}if(!p)throw new Error("Merge-request did not return a result message");const d=Ha(p),u=await this.workClient.sendMergeRequest(d.title,d.description);this.workClient.sendAssistantMessage(`${d.userMessage}\n\n✅ Pull request created successfully!\nNumber: #${u.pullRequestNumber}\nURL: ${u.pullRequestUrl}`,{groupId:this.currentGroupId??void 0})}catch(e){const n=e instanceof Error?e.message:String(e);this.log("error","MERGE","Merge-request failed:",e),this.workClient.sendSystemErrorMessage(`❌ Merge-request failed: ${n}\n\nPlease check git status and try again, or create the PR manually.`,{groupId:this.currentGroupId??void 0})}var t,s}async executeBashCommand(e){if(!oe.isDirectBashAllowed())return this.log("warn","BASH","Direct bash execution is disabled by global settings"),void this.workClient.sendSystemErrorMessage("Direct bash execution is disabled by global settings.",{groupId:this.currentGroupId??void 0});this.log("info","BASH",`Executing command: ${e}`);const n={senderType:"agent",senderId:"bash",senderName:"bash"},t=await Js(e,this.workingDirectory,{onOutput:e=>{this.workClient.sendTaskMessage(n,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: ${t})`)}async executeMergePr(){await ea({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"}),commitChanges:()=>this.commitCurrentChangesWithAgent()})}async commitCurrentChangesWithAgent(){this.log("info","MERGE","Generating commit message with agent"),await Qa({runner:this.runner,workingDirectory:this.workingDirectory,model:this.options.input.model,abortController:this.abortController,modeConfig:this.getRunnerModeConfig(),schemaTarget:"claude",onStreamMessage:async e=>{const n=this.taskAgentsMap.size>1?e:this.messageFilter.filter(e);null!==n&&this.workClient.sendTaskEvent(this.getChatSenderMeta(),n,{groupId:this.currentGroupId??void 0})}}),this.log("info","MERGE","Committed changes with agent-generated message")}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,n=this.runner,t=this.getRunnerModeConfig(),s="group_chat"===t.mode||"group_work"===t.mode,a=this.createPermissionHandler(),i=this.buildSystemHooks({trackBackgroundTasks:!0,trackPrimaryAgentStop:!0});this.initializePermissionModeState();const o=n.loop({cwd:this.workingDirectory,model:this.options.input.model,agentSessionId:e,abortController:this.abortController,initialPermissionMode:this.getPermissionModeSnapshot()??void 0,stderr:e=>{this.log("debug","SDK",e)},modeConfig:t,agentrixTools:this.agentrixTools,canUseTool:a,hooks:i,maxTurns:this.options.input.maxTurns??void 0});this.loopPermissionModeSetter=o.setPermissionMode??null,this.activePermissionMode=null,this.lastBroadcastPermissionMode=null,this.broadcastPermissionMode(this.getPermissionModeSnapshot()),await this.flushDesiredPermissionMode(),(async()=>{try{for(;!this.isStopping;){const e=await this.coordinator.waitForAgentMessage();if(!e){if(this.isStopping)break;continue}o.push(e);const n=e.__localSequence;void 0!==n&&(this.markPrimaryMessageProcessed(n),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.workClient.sendTaskSlashCommandsUpdate(Va(e.slash_commands??[]),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 n=s?e:this.messageFilter.filter(e);null!==n&&this.workClient.sendTaskEvent(this.getChatSenderMeta(),n,{groupId:this.currentGroupId??void 0})}this.loopPermissionModeSetter=null,this.activePermissionMode=null,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 n=e,t=Array.isArray(n.questions)?n.questions:[];if(0===t.length)return this.log("warn","PERMISSION","AskUserQuestion missing questions"),{behavior:"deny",message:"AskUserQuestion missing questions"};const s=t.map(e=>({...e,options:[...e.options,{label:"Other",description:""}]}));try{const e=await this.askUser(s),a={};for(let n=0;n<t.length;n+=1){const s=t[n]?.question;if(!s)continue;const i=e.answers?.[n];"string"==typeof i&&(a[s]=i)}return{behavior:"allow",updatedInput:{...n,answers:a}}}catch(e){return this.log("warn","PERMISSION",`AskUserQuestion failed: ${e}`),{behavior:"deny",message:"AskUserQuestion failed"}}}createPermissionHandler(){return async(e,n)=>{if("AskUserQuestion"===e)return this.handleAskUserQuestionPermission(n);if("ExitPlanMode"===e)return this.handleExitPlanModePermission(n);if(this.grantedPermissions.has(e))return this.log("info","PERMISSION",`Tool "${e}" already granted, skipping`),{behavior:"allow",updatedInput:n};const t=this.pendingPermissions.get(e);if(t)return this.log("info","PERMISSION",`Tool "${e}" has pending request, waiting...`),"allow"===await t?{behavior:"allow",updatedInput:n}:{behavior:"deny",message:"Permission denied by user"};let s;this.log("info","PERMISSION",`Requesting permission for "${e}"`);const a=new Promise(e=>{s=e});this.pendingPermissions.set(e,a);try{const t=await this.requestToolPermission(e);return s(t),"allow"===t?(this.grantedPermissions.add(e),{behavior:"allow",updatedInput:n}):{behavior:"deny",message:"Permission denied by user"}}catch(e){return s("deny"),{behavior:"deny",message:"Permission request failed"}}finally{this.pendingPermissions.delete(e)}}}async handleExitPlanModePermission(e){const n=e.planFilePath??e.filePath;let t,s;if(n){const e=this.workspace.getCwd(),a=e.endsWith("/")?e:e+"/";t=n.startsWith(a)?n.slice(a.length):void 0;try{const e=await ve.readFile(n,"utf-8");s=e.length>8e3?e.slice(0,8e3)+"\n\n…(truncated)":e}catch{}}!s&&"string"==typeof e.plan&&e.plan&&(s=e.plan);const a=[{question:"Review the plan and choose how to proceed.",header:"Plan Review",multiSelect:!1,options:[{label:"Approve",description:"Approve the plan and start implementation"},{label:"Revise",description:"Need to revise the plan",additionalInput:{enabled:!0,required:!1,placeholder:"Describe what should change."}},{label:"Cancel",description:"Cancel this plan"}],planFilePath:t,planContent:s}];try{const n=await this.askUser(a,{onTimeout:"abort_task"}),t=n.answers[0],s=n.details?.[0]?.trim();return"Approve"===t?{behavior:"allow",updatedInput:e}:"Revise"===t?{behavior:"deny",message:s?`The user wants to revise the plan. Revision notes: ${s}. Please reconsider and update the plan, then call ExitPlanMode again when ready.`:"The user wants to revise the plan. Please reconsider and update the plan, then call ExitPlanMode again when ready."}:(await this.restoreConfiguredPermissionMode(),{behavior:"deny",message:"User cancelled plan review",interrupt:!0})}catch{return await this.restoreConfiguredPermissionMode(),{behavior:"deny",message:"Plan review failed or was interrupted"}}}async requestToolPermission(e){const n=[{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(n,{onTimeout:"abort_task"})).answers[0]?"allow":"deny"}catch(e){return this.log("warn","PERMISSION",`Permission request failed: ${e}`),"deny"}}async askUser(e,n={}){const t=this.workClient;return ta(e,this.askUserAwaiter,{sendAskUser:e=>t.sendAskUser(this.getChatSenderMeta(),e,{groupId:this.currentGroupId??void 0}),sendAskUserResponse:(e,n)=>t.sendAskUserResponse(e,n),onTimeoutMessage:e=>t.sendAssistantMessage(e,{groupId:this.currentGroupId??void 0}),stopTask:e=>this.stopTask(e)},n)}async onUncommittedChanges(){const e=[{question:"Uncommitted changes detected in the working directory. How would you like to proceed?",header:"Git Status",multiSelect:!1,rememberSelection:{enabled:!0,defaultValue:!0},options:[{label:"Ignore",description:"Keep changes on current branch and continue without switching"},{label:"Commit",description:"Create a commit with an agent-generated message, 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 n=await this.askUser(e,{onTimeout:"abort_task"}),t=n.answers[0],s=n.rememberAnswers?.[0]??e[0]?.rememberSelection?.defaultValue??!1;return t.startsWith("other:")?(this.log("info","GIT",`User provided custom input: ${t}, defaulting to Abort`),{action:"Abort",remember:!1}):{action:{Ignore:"Ignore",Commit:"Commit",Stash:"Stash",Abort:"Abort"}[t]||"Abort",remember:s}}catch(e){return this.log("warn","GIT",`Failed to get user response for uncommitted changes: ${e}`),{action:"Abort",remember:!1}}}async onBranchMismatch(e){const n=[{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"}],t=[{question:`Branch mismatch detected. Current: ${e.currentBranch}. Expected: ${e.expectedBranch}. How would you like to proceed?`,header:"Git Branch",multiSelect:!1,rememberSelection:{enabled:!0,defaultValue:!0},options:n}];try{const e=await this.askUser(t,{onTimeout:"abort_task"}),n=e.answers[0],s=e.rememberAnswers?.[0]??t[0]?.rememberSelection?.defaultValue??!1;return n.startsWith("other:")?(this.log("info","GIT",`User provided custom input: ${n}, defaulting to Abort`),{action:"Abort",remember:!1}):{action:{Switch:"Switch",Keep:"Keep",Abort:"Abort"}[n]||"Abort",remember:s}}catch(e){return this.log("warn","GIT",`Failed to get user response for branch mismatch: ${e}`),{action:"Abort",remember:!1}}}getRunnerMode(){const e=this.taskAgentsMap.size>1,n=this.options.input.taskType,t=!(!process.env.AGENTRIX_COMPANION_HOME&&!process.env.AGENTRIX_COMPANION_WORKSPACE);return"shadow"===n?"companion_shadow":t&&"chat"===n?"companion_chat":e?"chat"===n?"group_chat":"group_work":"chat"===n?"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,n=this.options.input.userId,t=oe.resolveDataDir(n,e);this.chatHistoryDb=Nt({dataDir:t,taskId:e})}return{createTask:ps(n={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),invokeAgent:(e,n)=>this.invokeAgent(e,n),assign:(e,n,t)=>this.assignWork(e,n,t),setPendingNavigateTaskId:e=>{this.pendingNavigateTaskId=e}}),createSoloTask:ls(n),createGroupTask:ds(n),replyToSubTask:is(n),changeTaskTitle:as(n),askUser:us(n),getTaskHistory:os(n),getTaskAgents:rs(n),listSubTask:cs(n),invoke:ms(n),assign:hs(n),updateAgentInfo:gs(n),sendReminder:vs(n),listTasks:fs(n),readConversation:xs(n),uploadFile:bs(n),listAgents:ys(n)};var n}resolveTaskAgentName(e){return this.taskAgentsMap.get(e)?.name||""}getChatSenderMeta(){return{senderType:"agent",senderId:this.primaryAgentId,senderName:this.primaryAgentName}}sendAgentErrorMessage(e,n,t,s){const a=n||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${a}: ${t}`}]}};this.workClient.sendTaskMessage({senderType:"agent",senderId:e,senderName:a},i,{groupId:s?.groupId})}async invokeAgent(e,n){const t=this.buildSubAgentHistoryContext(e,n);if(!t)return!1;const s=this.taskAgentsMap.get(e),a=s?.type||"claude";let i=this.agentQueues.get(e);i||(i=new za,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 n=this.newMessageGroupId();try{const s=await ja.create(a,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=Yt(),u=s.loop({cwd:this.workingDirectory,model:this.options.input.model,agentSessionId:t.sessionId,abortController:this.abortController,modeConfig:r,agentrixTools:this.agentrixTools,canUseTool:p,hooks:l,maxTurns:this.options.input.maxTurns??void 0});let m=t.message;if("codex"===a&&!t.sessionId){const n=[ua(e,i),"=== CONVERSATION STREAM START FROM HERE ===",fa(t.message)].join("\n\n").trim();n&&(m=n)}u.push(m);const g=t.lastSequence;let h=!1;t.sessionId&&(this.historyDb.updateAgentLastSequence(e,g),h=!0);let f=!1;for await(const t of u.events){if("system"===t.type&&"init"===t.subtype){this.historyDb?.upsertAgentSession(e,t.session_id),h||(this.historyDb.updateAgentLastSequence(e,g),h=!0);continue}if("result"===t.type){this.workClient.sendTaskMessage({senderType:"agent",senderId:e,senderName:o},t,{groupId:n}),f=!0;break}const s=c?t:d.filter(t);s&&this.workClient.sendTaskEvent({senderType:"agent",senderId:e,senderName:o},s,{groupId:n})}}catch(n){this.log("error","INVOKE",`Invoke failed for ${e}:`,n)}finally{this.coordinator?.setAgentRunning(e,o,!1)}}),!0}async assignWork(e,n,t){const s=this.taskAgentsMap.get(e),a=s?.type||"claude";let i=this.agentQueues.get(e);i||(i=new za,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 s=this.newMessageGroupId();var i;t&&this.workClient.sendTaskMessage({senderType:"agent",senderId:e,senderName:o},(i=t,{type:"assistant",session_id:"",uuid:crypto.randomUUID(),parent_tool_use_id:null,message:{role:"assistant",content:[{type:"text",text:i}]}}),{groupId:this.newMessageGroupId()});try{const t=await ja.create(a,e,{logger:this.log.bind(this),context:this.agentContext}),i={mode:"work",supportChangeTitle:!1},r=this.createPermissionHandler(),p=this.buildSystemHooks({trackBackgroundTasks:!1}),l=Yt(),d=t.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(n);let u=!1;for await(const n of d.events){if("system"===n.type&&"init"===n.subtype)continue;if("result"===n.type){this.workClient.sendTaskMessage({senderType:"agent",senderId:e,senderName:o},n,{groupId:s}),u=!0;break}const t=c?n:l.filter(n);t&&this.workClient.sendTaskEvent({senderType:"agent",senderId:e,senderName:o},t,{groupId:s})}}catch(n){this.log("error","RUN_TASK",`Run task failed for ${e}:`,n);const t=n instanceof Error?n.message:String(n);this.sendAgentErrorMessage(e,o,`I meet some error: ${t}`,{groupId:s})}finally{this.coordinator?.setAgentRunning(e,o,!1)}})}buildSubAgentHistoryContext(e,n){const t=this.historyDb;if(!t)return this.log("warn","HISTORY","Task history DB unavailable; delegate cannot build context."),null;const s=t.getAgentSessions().get(e),a=t.getAgentLastSequences().get(e)??0,i=t.pageRecentMessagesAfter(a,20);if(0===i.data.length&&!n)return null;const o=this.mergeConsecutiveHumanMessages(i.data),r=this.buildHistoryMessages(o,n);return r?{message:r,sessionId:s,lastSequence:i.data.length>0?i.data[i.data.length-1].localSequence:a}:null}buildHistoryMessages(e,n){const t=[];for(const n of e){const e=Qt(n);e&&t.push(e)}if(0===t.length&&!n)return null;let s=t.join("\n");return n&&(s=`<hint>\n${n}\n</hint>\n\n${s}`),{type:"user",message:{role:"user",content:s},parent_tool_use_id:null,session_id:""}}buildSystemHooks(e){const n=e?.trackBackgroundTasks??!0,t=e?.trackPrimaryAgentStop??!1,s={};return n&&(s.PostToolUse=async e=>(this.syncPermissionModeFromPostToolUse(e),this.trackBackgroundTaskFromPostToolUse(e),{})),t&&(s.Stop=async()=>(this.updateAgentRunning(!1),{})),s}trackBackgroundTaskFromPostToolUse(e){if(!e||"object"!=typeof e)return void this.log("debug","TASK","PostToolUse hook input is not an object");const n=e,t=n.tool_input;if(!t||!0!==t.run_in_background)return;const s=this.extractBackgroundTaskId(n.tool_response);if(!s)return this.log("debug","TASK",`PostToolUse(${n.tool_name}) run_in_background=true but no task_id found, using anonymous tracking`),void this.coordinator?.setAnonymousBackgroundTaskRunning(!0);this.coordinator?.setBackgroundTaskRunning(s,!0),this.log("info","TASK",`Background task started: ${s} (tool: ${n.tool_name})`)}syncPermissionModeFromPostToolUse(e){if(!e||"object"!=typeof e)return;const n=(t=e.tool_name,s=this.configuredPermissionMode,"EnterPlanMode"===t?"plan":"ExitPlanMode"===t?s:null);var t,s;n&&this.confirmPermissionModeApplied(n)}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 n=new Set,t=new Set,s=e=>{if("string"!=typeof e)return;const t=e.trim();t&&n.add(t)},a=e=>{if(null==e)return;if("string"==typeof e)return void(e=>{const n=/(task[_-]?id|agent[_-]?id|shell[_-]?id)["'\s:=]+([A-Za-z0-9._:-]+)/gi;let t;for(;null!==(t=n.exec(e));)s(t[2])})(e);if("object"!=typeof e)return;if(t.has(e))return;if(t.add(e),Array.isArray(e)){for(const n of e)a(n);return}const n=e;"string"==typeof n.task_id&&s(n.task_id),"string"==typeof n.taskId&&s(n.taskId),"string"==typeof n.agent_id&&s(n.agent_id),"string"==typeof n.agentId&&s(n.agentId),"string"==typeof n.shell_id&&s(n.shell_id),"string"==typeof n.shellId&&s(n.shellId);for(const e of Object.values(n))a(e)};a(e);const i=[...n];return i.length>1&&this.log("warn","TASK",`Multiple background task ids extracted (${i.join(", ")}), using first id ${i[0]}`),i[0]}createWorkerClientConfig(e,n,t){const s=this.options.input.agentId,a=this.taskAgentsMap.get(s)?.name;return{config:{userId:e,taskId:n,chatId:this.options.input.chatId,machineId:this.credentials.machineId,agentId:s,agentName:a,cwd:t,serverUrl:oe.serverUrl.replace(/^http/,"ws"),path:"/v1/ws",auth:ee(this.credentials.token,this.credentials.machineId,n),dataEncryptionKey:this.options.dataEncryptionKey??null,keepAliveConfig:{intervalMs:2e4,event:"worker-alive",payloadGenerator:()=>{const e=this.coordinator?.getStatus(),t="running"===e?.state?"worker-running":"worker-ready";return{eventId:N(),status:t,taskId:n,machineId:this.credentials.machineId,timestamp:Date.now().toString(),activeAgents:this.coordinator?.getActiveAgents(),permissionMode:this.getPermissionModeSnapshot()}}},healthCheckConfig:{enabled:!0,intervalMs:3e4,timeoutMs:5e3},logger:(e,...n)=>this.logger.info(`[SOCKET] ${e}`,...n)},handlers:{attachmentsDir:oe.resolveAttachmentsDir(e,n),logger:(e,n,t,...s)=>{this.log(e,n,t,...s)},stopTask:async()=>{this.stopTask("event")},shouldPersistTaskMessage:async e=>!Q(e)||!this.shouldDropHeartbeatWhileBusy()||(this.log("debug","WORKER","Dropping heartbeat at WorkerClient receive stage: agent is running"),!1),onTaskMessage:async(e,n)=>{if(B(e)){const[n,t]=this.askUserAwaiter.entries().next().value||[];n&&t&&(this.askUserAwaiter.delete(n),t(e))}},onTaskInfoUpdate:async e=>{na(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 n=Xt(e,this.options.dataEncryptionKey);await this.coordinator.enqueue(n)}}}}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,n,t,...s){this.logger&&this.logger[e](`[${n}] ${t}`,...s)}get taskId(){return this.options.input.taskId}async handleSdkResultMessage(e){let n,t;try{const e=await this.workspace.prepareResultArtifacts({onPatchError:e=>{this.log("warn","GIT","Failed to write patch diff for result:",e)}});n=e.artifacts,t=e.artifactVersion}catch(e){this.log("warn","GIT","Failed to prepare git artifacts for result:",e)}const s=this.getRunnerMode(),a="group_chat"===s||"group_work"===s,i=this.pendingNavigateTaskId;if(this.pendingNavigateTaskId=null,a?this.workClient.sendTaskEvent(this.getChatSenderMeta(),e,{...n?{artifacts:n}:{},groupId:this.currentGroupId??void 0,navigateToTaskId:i??void 0}):this.workClient.sendTaskMessage(this.getChatSenderMeta(),e,{...n?{artifacts:n}:{},groupId:this.currentGroupId??void 0,navigateToTaskId:i??void 0}),t)try{await Xs(this.options.input.userId,this.taskId,t)}catch(e){this.log("warn","GIT","Failed to mark artifact version as sent:",e)}}}class ni{static async calculateFinalCwd(e){const{repositorySourceType:n,cwd:t,userCwd:s,userId:i,taskId:o,forceUserCwd:r}=e;if(t)return t;const c=oe.resolveProjectDir(i,o);if("directory"===n&&s){const e=s.replace(/^~/,a());return r?e:await this.shouldUseWorktree(e)?c:e}return c}static async shouldUseWorktree(e){try{return!As(e)&&await ks(e)}catch{return!1}}}var ti=Tn(ue);class si{constructor(e,n){this.credentials=e,this.options=n}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-${se()}`}async start(){try{await this.initialize(),await this.handleEvent(),await this.runCodex(),await this.exitWorker("completed")}catch(e){if(!this.isStopping){this.isStopping=!0,this.askUserAwaiter.clear(),this.coordinator?.stop(),this.log("warn","AGENT","Fatal error:",e);const n=e instanceof Error?e.message:String(e);throw await this.exitWorker("error",n),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,n=this.options.input.userId;this.logger=this.createLogger({type:"worker",taskId:e}),this.dataEncryptionKey=this.options.dataEncryptionKey??null;const t=Ws(this.options.input),s=await ni.calculateFinalCwd(t),a={...t,cwd:s};this.log("info","INIT",`Phase 1: Working directory: ${s}`);const i=this.createWorkerClientConfig(n,e,s),o=oe.resolveDataDir(n,e);this.historyDb=Nt({dataDir:o,taskId:e});const r=new Bt(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 Ua({options:a,handlers:this.createWorkspaceHandlers(r,s)}),{initialCommitHash:l,gitStateResult:d}=await p.setup();this.workspace=p,this.log("info","INIT","Phase 7: Workspace setup complete"),r.sendWorkerInitialized(),r.sendTaskSlashCommandsUpdate(Va()),this.log("info","INIT","Phase 8: Initialization finalized"),await this.registerWithDaemon(s),this.log("info","INIT","Phase 9: Registered with daemon"),this.context={credentials:this.credentials,options:this.options,workClient:r,workingDirectory:s,initialCommitHash:l,logger:this.logger},process.env.AGENTRIX_WORKING_DIR=s,process.env.AGENTRIX_WORKING_USER=n,process.env.AGENTRIX_WORKING_TASK=e,this.options.input.environmentVariables&&Object.entries(this.options.input.environmentVariables).forEach(([e,n])=>{null!=n&&(process.env[e]=String(n))}),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,n){return{onRepositoryDetected:n=>{e.associateRepository(n.host,n.owner,n.repo,n.url)},onUncommittedChanges:this.onUncommittedChanges.bind(this),onCommitUncommittedChanges:async()=>this.commitCurrentChangesWithAgent(n),onBranchMismatch:this.onBranchMismatch.bind(this)}}async registerWithDaemon(e){const n=this.options.input.taskId,t=await hn(n,{cwd:e,machineId:this.credentials.machineId,pid:process.pid,startedBy:this.options.startedBy||"terminal"});t.error?this.log("warn","DAEMON",`Failed to report session ${n}:`,t.error):this.log("info","DAEMON",`Session ${n} registered`)}createMessageCoordinator(e,n){return this.coordinator=new Qs({workerType:"codex",workClient:e,handlers:{onNormalMessage:async e=>this.convertSDKMessageToCodexInput(e),onBashCommand:async(e,n)=>{await this.executeBashCommand(e)},onMergeRequest:async e=>{await this.executeMergeRequest()},onMergePr:async()=>{await this.executeMergePr()},onNewSession:async()=>{await this.executeNewSession()}},logger:(e,n,t)=>{const s=e;this.log(s,n,t)},idleTimeoutMs:n,onIdleTimeout:()=>this.stopTask("idle")}),this.coordinator}async handleEvent(){if("task-message"===this.options.input.event){const e=this.options.input.eventData.message;e&&K(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 Ts(this.context.workingDirectory)&&await this.commitCurrentChangesWithAgent();const e=await Es(this.context.workingDirectory),n=this.context.initialCommitHash,t=await Os(this.context.workingDirectory);if(this.log("info","MERGE",`Pushing branch ${t} to remote`),await Bs(this.context.workingDirectory,t,!1,this.options.input.gitServerId),this.log("info","MERGE","Successfully pushed branch to remote"),!n){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 _s(this.context.workingDirectory,n,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 s=Ys(n);this.log("debug","MERGE",`PR prompt: ${s.substring(0,200)}...`);const a=this.options.input.agentId??"default",i=await ja.create("codex",a),o={mode:"work",supportChangeTitle:!1},r=i.runStreamed(s,{cwd:this.context.workingDirectory,model:this.currentModel||void 0,abortController:this.abortController,modeConfig:o,structuredOutputSchema:{type:"json_schema",schema:Wa}});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 n=this.filterMessages(e);null!==n&&this.context.workClient.sendTaskEvent(this.getChatSenderMeta(),n,{groupId:this.currentGroupId??void 0})}if(!c)throw new Error("Merge-request did not return a result message");const p=Ha(c);await this.createPullRequest(p.title,p.description),this.sendMessage(p.userMessage)}catch(e){const n=e instanceof Error?e.message:String(e);this.log("error","MERGE","Merge-request failed:",e),this.context.workClient.sendSystemErrorMessage(`Merge-request failed: ${n}\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){if(!oe.isDirectBashAllowed())return this.log("warn","BASH","Direct bash execution is disabled by global settings"),void this.context.workClient.sendSystemErrorMessage("Direct bash execution is disabled by global settings.",{groupId:this.currentGroupId??void 0});this.log("info","BASH",`Executing command: ${e}`);const n=await Js(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: ${n})`)}async executeMergePr(){await ea({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"}),commitChanges:()=>this.commitCurrentChangesWithAgent()})}async commitCurrentChangesWithAgent(e){const n=this.options.input.agentId??"default",t=await ja.create("codex",n),s=e||this.context?.workingDirectory;if(!s)throw new Error("Working directory is not available for commit generation");this.log("info","MERGE","Generating commit message with agent"),await Qa({runner:t,workingDirectory:s,model:this.currentModel||this.options.input.model||void 0,abortController:this.abortController,modeConfig:{mode:"work",supportChangeTitle:!1},schemaTarget:"openai",onStreamMessage:async e=>{const n=this.filterMessages(e);null!==n&&this.getActiveWorkClient().sendTaskEvent(this.getChatSenderMeta(),n,{groupId:this.currentGroupId??void 0})}}),this.log("info","MERGE","Committed changes with agent-generated message")}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",n=(await ja.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)n.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 n.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.context.workClient.sendTaskSlashCommandsUpdate(Va(e.slash_commands??[]),e.session_id),this.log("info","AGENT",`Thread started: ${e.session_id}`),this.refreshGroupId(),this.updateAgentRunning(!0);continue}const n=this.filterMessages(e);null!==n&&("result"===e.type?await this.handleSdkResultMessage(n):this.context.workClient.sendTaskEvent(this.getChatSenderMeta(),n,{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 n=e,t=n?.message?.content;if(!t||"string"==typeof t)return e;const s=t.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"===n.type&&"tool_result"!==e.type));return 0===s.length?null:(n.message.content=s,n)}sendMessage(e){const n={type:"assistant",message:{id:se().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:se().toString()};this.getActiveWorkClient().sendTaskMessage(this.getChatSenderMeta(),n,{groupId:this.currentGroupId??void 0})}async askUser(e,n={}){const t=this.getActiveWorkClient();return ta(e,this.askUserAwaiter,{sendAskUser:e=>t.sendAskUser(this.getChatSenderMeta(),e,{groupId:this.currentGroupId??void 0}),sendAskUserResponse:(e,n)=>t.sendAskUserResponse(e,n),onTimeoutMessage:e=>this.sendMessage(e),stopTask:e=>this.stopTask(e)},n)}getActiveWorkClient(){const e=this.context?.workClient??this.workClient;if(!e)throw new Error("[WORKER] WorkerClient not available");return e}resolveTaskAgentName(e){const n=this.options.input.taskAgents??[];return n.find(n=>n.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,rememberSelection:{enabled:!0,defaultValue:!0},options:[{label:"Ignore",description:"Keep changes on current branch and continue without switching"},{label:"Commit",description:"Create a commit with an agent-generated message, 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 n=await this.askUser(e,{onTimeout:"abort_task"}),t=n.answers[0],s=n.rememberAnswers?.[0]??e[0]?.rememberSelection?.defaultValue??!1;return t.startsWith("other:")?(this.log("info","GIT",`User provided custom input: ${t}, defaulting to Abort`),{action:"Abort",remember:!1}):{action:{Ignore:"Ignore",Commit:"Commit",Stash:"Stash",Abort:"Abort"}[t]||"Abort",remember:s}}catch(e){return this.log("warn","GIT",`Failed to get user response for uncommitted changes: ${e}`),{action:"Abort",remember:!1}}}async onBranchMismatch(e){const n=[{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"}],t=[{question:`Branch mismatch detected. Current: ${e.currentBranch}. Expected: ${e.expectedBranch}. How would you like to proceed?`,header:"Git Branch",multiSelect:!1,rememberSelection:{enabled:!0,defaultValue:!0},options:n}];try{const e=await this.askUser(t,{onTimeout:"abort_task"}),n=e.answers[0],s=e.rememberAnswers?.[0]??t[0]?.rememberSelection?.defaultValue??!1;return n.startsWith("other:")?(this.log("info","GIT",`User provided custom input: ${n}, defaulting to Abort`),{action:"Abort",remember:!1}):{action:{Switch:"Switch",Keep:"Keep",Abort:"Abort"}[n]||"Abort",remember:s}}catch(e){return this.log("warn","GIT",`Failed to get user response for branch mismatch: ${e}`),{action:"Abort",remember:!1}}}async createPullRequest(e,n){this.log("info","MERGE",`Creating PR: ${e}`);try{const t=await this.context.workClient.sendMergeRequest(e,n);this.sendMessage(`✅ Pull request created successfully!\nNumber: #${t.pullRequestNumber}\nURL: ${t.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 n=e.message.content;if("string"==typeof n)return n;if(Array.isArray(n)){const e=[],t=oe.resolveAttachmentsDir(this.options.input.userId,this.taskId);for(const s of n)if("text"===s.type&&s.text)e.push(s.text);else if("image"===s.type&&s.source&&s.source.url){const n=s.source.url;try{const{filePath:s}=await Ft(n,t,!1);this.log("info","IMAGE",`Downloaded image from ${n} to ${s}`),e.push(`Image: ${s}`)}catch(e){this.log("error","IMAGE",`Failed to download image from ${n}:`,e)}}else if("document"===s.type&&s.source&&s.source.url){const n=s.source.url;try{const{filePath:a,mimeType:i,filename:o}=await Ft(n,t,!0);this.log("info","DOCUMENT",`Downloaded document from ${n} to ${a}`);const r=s.title||o;e.push(`Document: ${a}\nTitle: ${r}\nType: ${i}`)}catch(e){this.log("error","DOCUMENT",`Failed to download document from ${n}:`,e)}}const s=e.map(e=>e.trim()).filter(Boolean).join("\n\n").trim();if(s)return s}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,n,t){const s=this.options.input.agentId,a=this.options.input.taskAgents?.find(e=>e.id===s)?.name;return{config:{userId:e,taskId:n,chatId:this.options.input.chatId,machineId:this.credentials.machineId,agentId:s,agentName:a,cwd:t,serverUrl:oe.serverUrl.replace(/^http/,"ws"),path:"/v1/ws",auth:ee(this.credentials.token,this.credentials.machineId,n),dataEncryptionKey:this.dataEncryptionKey,keepAliveConfig:{intervalMs:2e4,event:"worker-alive",payloadGenerator:()=>{const e=this.coordinator?.getStatus(),t="running"===e?.state?"worker-running":"worker-ready";return{eventId:N(),status:t,taskId:n,machineId:this.credentials.machineId,timestamp:Date.now().toString()}}},healthCheckConfig:{enabled:!0,intervalMs:3e4,timeoutMs:5e3},logger:(e,...n)=>(this.context?.logger??this.logger)?.info(`[SOCKET] ${e}`,...n)},handlers:{stopTask:async()=>{this.stopTask("event")},onTaskMessage:async e=>{if(B(e)){const[n,t]=this.askUserAwaiter.entries().next().value||[];return void(n&&t&&(this.askUserAwaiter.delete(n),t(e)))}K(e)&&"user"===e.type&&await this.coordinator.enqueue(e)},onTaskInfoUpdate:async e=>{na(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,n){this.coordinator&&this.coordinator.stop(),this.log("info","WORKER",`Exiting with status: ${e} for task ${this.taskId}`),"error"===e&&n?await this.context.workClient.sendErrorMessageAndExit(n):(this.context.workClient.sendWorkerExit(e),await this.context.workClient.disconnect()),this.historyDb&&this.historyDb.close()}createLogger(e){const{createLogger:n}=ti;return n(e)}log(e,n,t,...s){const a=this.context?.logger??this.logger;a&&a[e](`[${n}] ${t}`,...s)}get taskId(){return this.options.input.taskId}getCurrentModel(){return this.currentModel||"gpt-5"}async handleSdkResultMessage(e){let n,t;try{const e=await this.workspace.prepareResultArtifacts({onPatchError:e=>{this.log("warn","GIT","Failed to write patch diff for result:",e)}});n=e.artifacts,t=e.artifactVersion}catch(e){this.log("warn","GIT","Failed to prepare git artifacts for result:",e)}if(this.context.workClient.sendTaskMessage(this.getChatSenderMeta(),e,{...n?{artifacts:n}:{},groupId:this.currentGroupId??void 0}),t)try{await Xs(this.options.input.userId,this.taskId,t)}catch(e){this.log("warn","GIT","Failed to mark artifact version as sent:",e)}}}const ai=["claude","codex","deployment","companion"],ii={claude:{async run({credentials:e,startedBy:n,userId:t,taskId:s,idleTimeoutSecond:a}){const i=oe.readTaskInput(t,s),o=i.dataEncryptionKey?D(i.dataEncryptionKey):null;if(o&&32!==o.length)throw new Error("Invalid dataEncryptionKey: expected decrypted 32-byte key");const r={startedBy:n,idleTimeoutSecond:a,input:i,dataEncryptionKey:o};await async function(e,n){const t=Ws(n.input),s=await ni.calculateFinalCwd(t),a=new ei(e,n,s);await a.start()}(e,r)}},codex:{async run({credentials:e,startedBy:n,userId:t,taskId:s,idleTimeoutSecond:a}){const i=oe.readTaskInput(t,s),o=i.dataEncryptionKey?D(i.dataEncryptionKey):null;if(o&&32!==o.length)throw new Error("Invalid dataEncryptionKey: expected decrypted 32-byte key");const r={startedBy:n,idleTimeoutSecond:a,input:i,dataEncryptionKey:o};await async function(e,n){const t=new si(e,n);await t.start()}(e,r)}},deployment:{async run({credentials:e,startedBy:n,userId:t,taskId:s,idleTimeoutSecond:a}){const i={input:oe.readTaskInput(t,s)};await async function(e,n){const t=n.input,{taskId:s,sourcePath:a,targetAgentId:i,userId:r,name:c,avatar:p,isSystemAgent:l,supportLocal:d}=t;let u=null;try{if(console.log(`[Deployment] Starting deployment worker for task ${s}`),!o.existsSync(a))throw new Error(`Source path not found: ${a}`);const n=v.join(oe.agentrixAgentsHomeDir,i);if(o.existsSync(n))throw new Error(`Target agent directory already exists: ${n}`);console.log(`[Deployment] Copying from ${a} to ${n}`),await Za(a,n),console.log("[Deployment] Deployment completed successfully"),u=function(e,n,t){const s=oe.serverUrl.replace(/^http/,"ws");return Se(s,{path:"/v1/ws",transports:["websocket"],auth:{token:e.token,clientType:"worker",machineId:e.machineId,taskId:t}})}(e,0,s),await new Promise((e,n)=>{const t=setTimeout(()=>{n(new Error("WebSocket connection timeout"))},1e4);u.on("connect",()=>{clearTimeout(t),console.log("[Deployment] Connected to server"),u.emit("deploy-agent-complete",{eventId:N(),taskId:s,targetAgentId:i,success:!0,name:c,avatar:p,isSystemAgent:l,supportLocal:d}),console.log("[Deployment] Sent deploy-agent-complete event"),setTimeout(()=>{e()},1e3)}),u.on("connect_error",e=>{clearTimeout(t),n(e)})})}catch(e){throw console.error("[Deployment] Deployment failed:",e),u&&u.connected&&(u.emit("deploy-agent-complete",{eventId:N(),taskId:s,targetAgentId:i,success:!1,error:e instanceof Error?e.message:String(e)}),await new Promise(e=>setTimeout(e,1e3))),e}finally{u&&u.disconnect(),process.exit(0)}}(e,i)}},companion:{async run({credentials:e,startedBy:n,userId:t,taskId:s,idleTimeoutSecond:a}){const i=oe.readTaskInput(t,s),o=i.dataEncryptionKey?D(i.dataEncryptionKey):null;if(o&&32!==o.length)throw new Error("Invalid dataEncryptionKey: expected decrypted 32-byte key");const r={startedBy:n,idleTimeoutSecond:a,input:i,dataEncryptionKey:o};await async function(e,n){const{agentDir:t,homeDir:s}=await Pt();n.input.agentDir=t,process.env.AGENTRIX_COMPANION_HOME=s;const a=Ws(n.input),i=await ni.calculateFinalCwd(a),o=new ei(e,n,i);await o.start()}(e,r)}}};async function oi(){const e=function(){try{const e=we(ce(),"package.json"),n=JSON.parse(fe(e,"utf-8"));if("string"==typeof n.version&&n.version.trim().length>0)return n.version}catch{}return"0.0.0"}();try{const n=Ae("npm view @agentrix/cli version",{encoding:"utf-8",stdio:["pipe","pipe","pipe"],timeout:5e3}).trim();return{hasUpgrade:function(e,n){const t=e.split(".").map(Number),s=n.split(".").map(Number);for(let e=0;e<Math.max(t.length,s.length);e++){const n=t[e]||0,a=s[e]||0;if(n>a)return 1;if(n<a)return-1}return 0}(n,e)>0,currentVersion:e,latestVersion:n}}catch(n){return{hasUpgrade:!1,currentVersion:e,latestVersion:null}}}function ri(){return"true"===process.env.AGENTRIX_DISABLE_AUTO_UPGRADE}async function ci(e){try{const{execSync:n}=await import("child_process");return console.log(""),e||(console.log(M.blue("🔄 Checking for upgrades...")),e=await oi()),e.hasUpgrade?(console.log(M.blue(`🔄 Upgrading from ${e.currentVersion} to ${e.latestVersion}...`)),n("npm install -g @agentrix/cli@latest",{stdio:"inherit"}),console.log(M.green("✓ Upgrade complete")),console.log(""),!0):(console.log(M.green("✓ Already on latest version")),console.log(""),!0)}catch(e){return console.log(""),console.log(M.yellow("⚠️ Auto-upgrade failed")),console.log(M.dim(" You can upgrade manually with: npm install -g @agentrix/cli@latest")),console.log(""),!1}}async function pi(e,n){const t=`${oe.serverUrl}/v1/agents/${encodeURIComponent(e)}/git-url`,s=await fetch(t,{headers:{Authorization:`Bearer ${n.token}`}});return s.ok?s.json():null}function li(e){try{const n=c(b(e,"agent.json"),"utf-8"),t=JSON.parse(n);return"string"==typeof t.version?t.version:null}catch{return null}}function di(e,n){const t=e=>e.split(".").map(e=>parseInt(e,10)||0),s=t(e),a=t(n);for(let e=0;e<Math.max(s.length,a.length);e++){const n=s[e]??0,t=a[e]??0;if(n>t)return!0;if(n<t)return!1}return!1}async function ui(e){const n=oe.agentrixAgentsHomeDir;if(!r(n))return;let t;try{t=m(n).filter(e=>p(b(n,e)).isDirectory())}catch{return}for(const s of t){if("companion"===s||s.startsWith("draftagent-")||s.includes("."))continue;const t=b(n,s),a=b(t,"upgrade");if(r(a))continue;const i=li(t);re.info(`[AGENT UPDATE] Checking ${s} (local version: ${i??"unknown"})`);try{const n=await pi(s,e);if(!n||!n.gitUrl){re.info(`[AGENT UPDATE] No git repo for ${s}, skipping`);continue}const t=`${a}.tmp-${Date.now()}`;try{const e=["git","clone","--depth=1","--branch",n.branch,n.gitUrl,t];qe(e.join(" "),{stdio:"pipe",timeout:12e4});const o=n.subDir?b(t,n.subDir):t;if(n.subDir&&!r(o))throw new Error(`subDir "${n.subDir}" not found in cloned repo`);const c=li(o);if(!c||i&&!di(c,i)){re.info(`[AGENT UPDATE] ${s} up to date (local: ${i??"unknown"}, remote: ${c??"unknown"})`),u(t,{recursive:!0,force:!0});continue}re.info(`[AGENT UPDATE] Update available for ${s}: ${i??"unknown"} → ${c}`),n.subDir?(d(o,a),u(t,{recursive:!0,force:!0})):d(t,a),re.info(`[AGENT UPDATE] Staged upgrade for ${s}`)}catch(e){throw r(t)&&u(t,{recursive:!0,force:!0}),e}}catch(e){re.warn(`[AGENT UPDATE] Check failed for ${s}: ${e}`)}}}function mi(){const e=oe.getStatePaths();return ye.join(ye.dirname(e.daemonStateFile),"upgrade-daemon.state.json")}function gi(){try{const e=mi();if(!he.existsSync(e))return null;const n=he.readFileSync(e,"utf-8");return JSON.parse(n)}catch{return null}}function hi(e){try{const n=mi();if(he.existsSync(n)){if("number"==typeof e){const n=gi();if(!n||n.pid!==e)return}he.unlinkSync(n)}}catch{}}function fi(e){try{return process.kill(e,0),!0}catch{return!1}}function xi(){const e=gi();return!(!e||!fi(e.pid)&&(hi(),1))}function vi(){const e=gi();if(e)try{fi(e.pid)&&process.kill(e.pid,"SIGTERM")}catch{}finally{hi()}}async function bi(){if(ri())return"no-upgrade";const e=await oi();if(e.hasUpgrade&&await ci(e))return await bn(),await new Promise(e=>setTimeout(e,1e3)),Dt(["daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref(),"upgraded";try{const e=await oe.readCredentials();e&&await ui(e)}catch{}return"no-upgrade"}var yi=Object.freeze({__proto__:null,isUpgradeDaemonRunning:xi,startUpgradeDaemon:async function(){await async function(){!function(e){const n=mi();he.writeFileSync(n,JSON.stringify(e,null,2))}({pid:process.pid,startedAt:(new Date).toISOString()}),process.on("SIGTERM",()=>{hi(process.pid),process.exit(0)}),process.on("SIGINT",()=>{hi(process.pid),process.exit(0)});try{"upgraded"===await bi()&&(Dt(["upgrade-daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref(),process.exit(0))}catch(e){}for(;;){await new Promise(e=>setTimeout(e,216e5));try{"upgraded"===await bi()&&(Dt(["upgrade-daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref(),process.exit(0))}catch(e){}}}()},stopUpgradeDaemon:vi});const wi=C(A(process.argv)).scriptName("agentrix").version(pe.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");oe.getStatePaths,wi.command("upgrade","Upgrade CLI to the latest version",{},async e=>{console.log(M.dim(`Current version: ${pe.version}`));const n=await fn();await ci()||process.exit(1);try{const e=await oe.readCredentials();e&&(console.log(M.dim("Checking agent updates...")),await ui(e))}catch{}if(n){console.log(M.blue("Restarting daemon...")),await bn(),await new Promise(e=>setTimeout(e,1e3)),Dt(["daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref();let e=!1;for(let n=0;n<50;n++)if(await new Promise(e=>setTimeout(e,100)),await fn()){e=!0;break}e?console.log(M.green("✓ Daemon restarted successfully")):console.log(M.yellow("⚠️ Daemon may still be starting. Run 'agentrix status' to check."))}try{const{version:e}=await import("./logger-gqEfOYLW.mjs").then(function(e){return e._});console.log(M.green(`\n✓ Now running version: ${e}`))}catch{console.log(M.dim("\nRun 'agentrix --version' to see the new version"))}process.exit(0)}),wi.command("doctor","System diagnostics & troubleshooting",{},async e=>{await ct(),process.exit(0)}),wi.command("logout","Logout from Agentrix",{},async e=>{try{await async function(){if(!await oe.readCredentials())return void console.log(M.yellow("Not currently authenticated"));console.log(M.blue("This will log you out of Agentrix")),console.log(M.yellow("⚠️ You will need to re-authenticate to use Agentrix again"));const e=me({input:process.stdin,output:process.stdout}),n=await new Promise(n=>{e.question(M.yellow("Are you sure you want to log out? (y/N): "),n)});if(e.close(),"y"===n.toLowerCase()||"yes"===n.toLowerCase())try{try{await bn(),console.log(M.gray("Stopped daemon"))}catch{}await oe.clearCredentials(),console.log(M.gray("Removed credentials")),console.log(M.green("✓ Successfully logged out"))}catch(e){throw new Error(`Failed to logout: ${e instanceof Error?e.message:"Unknown error"}`)}else console.log(M.blue("Logout cancelled"))}()}catch(e){console.error(M.red("Error:"),e instanceof Error?e.message:"Unknown error"),process.env.DEBUG&&console.error(e),process.exit(1)}process.exit(0)}),wi.command("stop","Stop the daemon",{},async e=>{vi(),await bn(),process.exit(0)}),wi.command("status","Show daemon and authentication status",{},async e=>{await ct("daemon"),console.log(""),await async function(){const e=await oe.readCredentials();if(console.log(M.bold("\nAuthentication Status\n")),!e)return void console.log(M.red("✗ Not authenticated"));console.log(M.green("✓ Authenticated"));const n=e.token.substring(0,30)+"...";console.log(M.gray(` Token: ${n}`)),e.machineId?(console.log(M.green("✓ Machine registered")),console.log(M.gray(` Machine ID: ${e.machineId}`)),console.log(M.gray(` Host: ${t.hostname()}`))):console.log(M.yellow("⚠️ Machine not registered")),console.log(M.gray(`\n Data directory: ${oe.agentrixHomeDir}`));try{await fn()?console.log(M.green("✓ Daemon running")):console.log(M.gray("✗ Daemon not running"))}catch{console.log(M.gray("✗ Daemon not running"))}}(),process.exit(0)}),wi.command("ls","List active sessions",{},async e=>{try{const e=await async function(){return(await gn("/list")).children||[]}();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)}),wi.command("killall","Clean up all runaway agentrix processes",{},async()=>{const e=await async function(){const e=await async function(){return(await at()).filter(e=>e.pid!==process.pid&&("daemon"===e.type||"worker"===e.type||"upgrade-daemon"===e.type)).map(e=>({pid:e.pid,command:e.command}))}(),n=[];let t=0;for(const{pid:s,command:a}of e)try{if(console.log(`Killing runaway process PID ${s}: ${a}`),"win32"===process.platform){const e=_e.sync("taskkill",["/F","/PID",s.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(s,"SIGTERM"),await new Promise(e=>setTimeout(e,1e3)),(await Me()).find(e=>e.pid===s)&&(console.log(`Process PID ${s} ignored SIGTERM, using SIGKILL`),process.kill(s,"SIGKILL"));console.log(`Successfully killed runaway process PID ${s}`),t++}catch(e){const t=e.message;n.push({pid:s,error:t}),console.log(`Failed to kill process PID ${s}: ${t}`)}return{killed:t,errors:n}}();console.log(`Cleaned up ${e.killed} runaway processes`),e.errors.length>0&&console.log("Errors:",e.errors),process.exit(0)}),wi.command("kill <sessionId>","Stop a specific session",e=>e.positional("sessionId",{type:"string",describe:"Session ID to stop"}),async e=>{try{const n=await async function(e){return(await gn("/stop-session",{sessionId:e})).success||!1}(e.sessionId);console.log(n?M.green("✓ Session stopped"):M.red("Failed to stop session"))}catch(e){console.log(M.red("No daemon running"))}process.exit(0)}),wi.command("daemon",!1,{},async e=>{try{await kn()}catch(e){console.error(M.red("Error:"),e instanceof Error?e.message:"Authentication failed"),process.env.DEBUG&&console.error(e),process.exit(1)}await Wt(),process.exit(0)}),wi.command("worker",!1,e=>e.option("type",{type:"string",choices:ai,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 n=e.type,t=ii[n];if(!t)throw new Error(`Unsupported worker type: ${String(e.type)}`);const s=e["started-by"],a=await kn(),i=e["user-id"],o=e["task-id"],r=e["idle-timeout"];await t.run({credentials:a,startedBy:s,userId:i,taskId:o,idleTimeoutSecond:r})}catch(e){console.error(M.red("Error:"),e instanceof Error?e.message:"Unknown error"),process.env.DEBUG&&console.error(e),process.exit(1)}}),wi.command("upgrade-daemon",!1,{},async e=>{const{startUpgradeDaemon:n}=await Promise.resolve().then(function(){return yi});await n(),process.exit(0)}),wi.command("start","Start daemon (if not running) and show status",{},async e=>{try{await kn()}catch(e){console.error(M.red("Error:"),e instanceof Error?e.message:"Authentication failed"),process.env.DEBUG&&console.error(e),process.exit(1)}const n=function(){const e=ot(),n=[],t=e.cli.find(e=>"git"===e.name);t&&!t.installed&&n.push("git");for(const t of e.missingSandbox)n.push(t.name);return{ok:0===n.length,missing:n}}();if(n.ok||(console.log(M.bold.red("\n⚠️ Missing Critical Dependencies")),console.log(M.yellow(`Cannot start daemon. Missing: ${n.missing.join(", ")}`)),console.log(M.blue('\nRun "agentrix doctor" for detailed dependency information and installation instructions.')),process.exit(1)),!await xn()){console.log("Starting Agentrix background service..."),Dt(["daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref();let e=!1;for(let n=0;n<50;n++)if(await new Promise(e=>setTimeout(e,100)),await fn()){e=!0;break}e?(await new Promise(e=>setTimeout(e,1200)),await fn()?console.log(M.green("✓ Daemon started successfully")):await async function(){const e=await async function(){const e=b(oe.getStatePaths().logsDir,"daemon.log");try{return(await tn(e,"utf8")).trim().split("\n").filter(Boolean).slice(-12).join("\n")||null}catch{return null}}();if(console.log(M.red("✗ Daemon exited shortly after startup")),!e)return;const n=e.split("\n").reverse().find(e=>e.includes("Machine binding revoked")||e.includes("Run `agentrix logout` and bind again"));n?console.log(M.yellow(n)):(console.log(M.gray("Recent daemon log:")),console.log(e))}()):console.log(M.yellow("⚠️ Daemon may still be starting..."))}if(ri()){const e=await oi();e.hasUpgrade&&(t=e).hasUpgrade&&t.latestVersion&&(console.log(""),console.log(M.yellow("┌────────────────────────────────────────────────────┐")),console.log(M.yellow("│")+" "+M.bold("Upgrade Available")+" "+M.yellow("│")),console.log(M.yellow("│")+" "+M.yellow("│")),console.log(M.yellow("│")+` Current: ${M.dim(t.currentVersion)} → Latest: ${M.green.bold(t.latestVersion)} `+M.yellow("│")),console.log(M.yellow("│")+" "+M.yellow("│")),console.log(M.yellow("│")+" Run "+M.cyan.bold("agentrix upgrade")+" to upgrade "+M.yellow("│")),console.log(M.yellow("│")+" "+M.yellow("│")),console.log(M.yellow("│")+" To enable auto-upgrade, set: "+M.yellow("│")),console.log(M.yellow("│")+" "+M.dim("AGENTRIX_DISABLE_AUTO_UPGRADE=false")+" "+M.yellow("│")),console.log(M.yellow("└────────────────────────────────────────────────────┘")),console.log(""))}else xi()||Dt(["upgrade-daemon"],{detached:!0,stdio:"ignore",env:process.env}).unref();var t;await ct("daemon"),process.exit(0)}),wi.demandCommand(1,"Please specify a command. Use --help to see available commands.").parse();
|