diff --git a/.github/plugin/marketplace.json b/.github/plugin/marketplace.json
index 258ce33..b28d429 100644
--- a/.github/plugin/marketplace.json
+++ b/.github/plugin/marketplace.json
@@ -41,7 +41,7 @@
{
"name": "azure-storage",
"description": "Azure Storage canvas — browse blobs and containers, bulk transfer with live progress, filter with aggregate statistics, mint and open SAS links, preview blobs, and plan account to account copies, all agent-drivable on one live surface.",
- "version": "0.3.2",
+ "version": "0.3.3",
"source": "canvases/azure-storage"
},
{
diff --git a/canvases/azure-storage/.github/plugin/plugin.json b/canvases/azure-storage/.github/plugin/plugin.json
index 3c3e2ed..8b2ff7e 100644
--- a/canvases/azure-storage/.github/plugin/plugin.json
+++ b/canvases/azure-storage/.github/plugin/plugin.json
@@ -1,7 +1,7 @@
{
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
"name": "azure-storage",
- "version": "0.3.2",
+ "version": "0.3.3",
"description": "Azure Storage canvas — browse blobs and containers, bulk transfer with live progress, filter with aggregate statistics, mint and open SAS links, preview blobs, and plan account to account copies, all agent-drivable on one live surface.",
"extensions": {
"com.github.copilot": {
diff --git a/canvases/azure-storage/SHA256SUMS b/canvases/azure-storage/SHA256SUMS
index 2d16ce9..2d99d93 100644
--- a/canvases/azure-storage/SHA256SUMS
+++ b/canvases/azure-storage/SHA256SUMS
@@ -1,14 +1,14 @@
-3a262e33c0e21381bd1a4f51edb8ffaf6d823d3a1516e4ef510ca3aff95da9b0 .github/plugin/plugin.json
+396925277edf6f794be74d0cd02f64226dbfa26abe6b2453a8fd0b3a44a58917 .github/plugin/plugin.json
a813071223c79d70046ffde6cd6de1d52eecf7b7b3ce174a3e1bcb2c2ebb283d THIRD_PARTY_NOTICES.txt
5fb6a9018aecd7aede2a8937f78d81867bf00c5550f30ab071d158b3852ccaca assets/preview.png
-122366309ceaa49cae3a1fad71798502bb0587e31ad50e1746ad8af8e7608a77 checksums.json
-45fcd18ae09de9b5542e7a113556482105da42419b1c603fcc69ace3be1a55b4 com.github.copilot/extensions/azure-storage/extension.mjs
+602d715345e1d6a9416c37dbe5019c2ec21a044cdd7721d42075a6fa29a5e94a checksums.json
+9f75b0541587faa2854f99718c5a028e13a4a2f7d2c6c46a0fd8f29bee548a2d com.github.copilot/extensions/azure-storage/extension.mjs
f7d102239138f46038f9fbbc576d6a34e2f03370f27c282dc7b59dbe470f791d com.github.copilot/extensions/azure-storage/sdk/blob.mjs
88d23b0a1a226385486aade505b086c7bf524ef0bd5b031bac4df0351e8a20f6 com.github.copilot/extensions/azure-storage/sdk/file.mjs
fa0526b9488b0e797bfa79044b632edb53483e9e2dc12fe672d093bfb9ace670 com.github.copilot/extensions/azure-storage/sdk/identity.mjs
6553c36dad97992722dd5d1320889ec09038847c31f2a04cf8756930f725c169 com.github.copilot/extensions/azure-storage/sdk/queue.mjs
cf4b43961f200d9d73f1158aa28b628863274d33e66f53457afa7f6a16562202 com.github.copilot/extensions/azure-storage/sdk/tables.mjs
-5520dc6cc7535a61cae0fe0c5764746837e96ecc5a431b360deca6d2534d0f3f com.github.copilot/extensions/azure-storage/studio-package.json
-be4affe6bd79ceb663389d03dc47fc1e55a8223d7075b370dc0f78853825faaf package.json
-e534abc17ed846674eeb89b13b1bf1da5efa3aad6e35fbc0fa9454b12eec118b release.json
+c0865cfca79c90f8ebf75e11d0cf9c61bda757b4f03160b89fd3ebb6622b7725 com.github.copilot/extensions/azure-storage/studio-package.json
+1434b589e284ae951a0ca236c237b936288959b6013af84119c8b0691c686aab package.json
+5a3b3801d5ace7180420f28c2d4658046ca30da52fe4062dadb27980bd91d80f release.json
27a2fce06a96abfd4a76405a78ff80b3be2cacf50f9dd4bde49649cfea84942f skills/azure-storage/SKILL.md
diff --git a/canvases/azure-storage/checksums.json b/canvases/azure-storage/checksums.json
index d6af1d2..e46f136 100644
--- a/canvases/azure-storage/checksums.json
+++ b/canvases/azure-storage/checksums.json
@@ -1,15 +1,15 @@
{
- ".github/plugin/plugin.json": "3a262e33c0e21381bd1a4f51edb8ffaf6d823d3a1516e4ef510ca3aff95da9b0",
+ ".github/plugin/plugin.json": "396925277edf6f794be74d0cd02f64226dbfa26abe6b2453a8fd0b3a44a58917",
"assets/preview.png": "5fb6a9018aecd7aede2a8937f78d81867bf00c5550f30ab071d158b3852ccaca",
- "com.github.copilot/extensions/azure-storage/extension.mjs": "45fcd18ae09de9b5542e7a113556482105da42419b1c603fcc69ace3be1a55b4",
+ "com.github.copilot/extensions/azure-storage/extension.mjs": "9f75b0541587faa2854f99718c5a028e13a4a2f7d2c6c46a0fd8f29bee548a2d",
"com.github.copilot/extensions/azure-storage/sdk/blob.mjs": "f7d102239138f46038f9fbbc576d6a34e2f03370f27c282dc7b59dbe470f791d",
"com.github.copilot/extensions/azure-storage/sdk/file.mjs": "88d23b0a1a226385486aade505b086c7bf524ef0bd5b031bac4df0351e8a20f6",
"com.github.copilot/extensions/azure-storage/sdk/identity.mjs": "fa0526b9488b0e797bfa79044b632edb53483e9e2dc12fe672d093bfb9ace670",
"com.github.copilot/extensions/azure-storage/sdk/queue.mjs": "6553c36dad97992722dd5d1320889ec09038847c31f2a04cf8756930f725c169",
"com.github.copilot/extensions/azure-storage/sdk/tables.mjs": "cf4b43961f200d9d73f1158aa28b628863274d33e66f53457afa7f6a16562202",
- "com.github.copilot/extensions/azure-storage/studio-package.json": "5520dc6cc7535a61cae0fe0c5764746837e96ecc5a431b360deca6d2534d0f3f",
- "package.json": "be4affe6bd79ceb663389d03dc47fc1e55a8223d7075b370dc0f78853825faaf",
- "release.json": "e534abc17ed846674eeb89b13b1bf1da5efa3aad6e35fbc0fa9454b12eec118b",
+ "com.github.copilot/extensions/azure-storage/studio-package.json": "c0865cfca79c90f8ebf75e11d0cf9c61bda757b4f03160b89fd3ebb6622b7725",
+ "package.json": "1434b589e284ae951a0ca236c237b936288959b6013af84119c8b0691c686aab",
+ "release.json": "5a3b3801d5ace7180420f28c2d4658046ca30da52fe4062dadb27980bd91d80f",
"skills/azure-storage/SKILL.md": "27a2fce06a96abfd4a76405a78ff80b3be2cacf50f9dd4bde49649cfea84942f",
"THIRD_PARTY_NOTICES.txt": "a813071223c79d70046ffde6cd6de1d52eecf7b7b3ce174a3e1bcb2c2ebb283d"
}
diff --git a/canvases/azure-storage/com.github.copilot/extensions/azure-storage/extension.mjs b/canvases/azure-storage/com.github.copilot/extensions/azure-storage/extension.mjs
index 8751cae..a536a74 100644
--- a/canvases/azure-storage/com.github.copilot/extensions/azure-storage/extension.mjs
+++ b/canvases/azure-storage/com.github.copilot/extensions/azure-storage/extension.mjs
@@ -4,7 +4,7 @@ var __defProp=Object.defineProperty;var __export=(target,all)=>{for(var name in
`;for(let res of clients)try{res.write(data)}catch{}}function setState(patch){let entitiesChanged=Object.hasOwn(patch,"s_entities");state={...state,...patch,s_entitiesRevision:(state.s_entitiesRevision||0)+Number(entitiesChanged)},broadcast(entitiesChanged)}function getState(){return state}function log(msg){let line=`[${new Date().toLocaleTimeString()}] ${msg}`,activityLog=[...state.activityLog||[],line].slice(-200);setState({activityLog})}let ctx={getState,setState,log},server2=http.createServer(async(req,res)=>{if(req.method==="GET"&&req.url==="/events"){res.writeHead(200,{"Content-Type":"text/event-stream","Cache-Control":"no-cache",Connection:"keep-alive"}),res.write(`data: ${JSON.stringify(state)}
-`),clients.add(res),req.on("close",()=>clients.delete(res));return}if(req.method==="GET"&&(req.url==="/"||req.url.startsWith("/?"))){let nonce=randomBytes(16).toString("base64");res.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Content-Security-Policy":cspHeader(nonce),"X-Content-Type-Options":"nosniff","Referrer-Policy":"no-referrer"}),res.end(typeof html=="function"?html(nonce):String(html||""));return}if(req.method==="GET"&&media&&req.url!=="/"&&!req.url.startsWith("/?")){let u=new URL(req.url,"http://127.0.0.1"),out=null;try{out=await media(u.pathname,u.searchParams,ctx)}catch(err){res.writeHead(500,{"Content-Type":"text/plain"}),res.end(String(err?.message||err));return}if(out&&out.buffer){res.writeHead(200,{"Content-Type":out.contentType||"application/octet-stream","Cache-Control":"no-store"}),res.end(out.buffer);return}}if(req.method==="POST"){if(!sameOriginLoopback(req)){res.writeHead(403,{"Content-Type":"application/json"}),res.end(JSON.stringify({ok:!1,error:"cross-origin request blocked"}));return}let path3=req.url.split("?")[0],handler=routes[path3];if(!handler){res.writeHead(404,{"Content-Type":"application/json"}),res.end(JSON.stringify({ok:!1,error:"no route "+path3}));return}let body="",tooLarge=!1;req.on("data",c=>{tooLarge||(body+=c,body.length>MAX_BODY&&(tooLarge=!0,res.writeHead(413,{"Content-Type":"application/json"}),res.end(JSON.stringify({ok:!1,error:"request body too large"})),req.destroy()))}),req.on("end",async()=>{if(tooLarge)return;let payload;try{payload=body?JSON.parse(body):{}}catch{res.writeHead(400,{"Content-Type":"application/json"}),res.end(JSON.stringify({ok:!1,error:"malformed JSON body"}));return}try{let out=await handler(payload,ctx);res.writeHead(200,{"Content-Type":"application/json"}),res.end(JSON.stringify(out??{ok:!0}))}catch(err){res.writeHead(500,{"Content-Type":"application/json"}),res.end(JSON.stringify({ok:!1,error:String(err?.message||err)}))}});return}res.writeHead(404),res.end()});return new Promise(resolve=>{server2.listen(port,"127.0.0.1",()=>{let port2=server2.address().port;resolve({port:port2,url:`http://127.0.0.1:${port2}`,getState,setState,log,close:()=>{for(let res of clients)try{res.end()}catch{}clients.clear(),server2.close()}})})})}async function safe(fn){try{return{ok:!0,data:await fn()}}catch(err){let msg=String(err?.message||err),code=String(err?.code||err?.statusCode||""),{needsAuth,kind}=classifyAuthError(msg,code);return{ok:!1,error:msg,needsAuth,authKind:kind}}}var azure_exports={};__export(azure_exports,{accountMeta:()=>accountMeta,blobSize:()=>blobSize,clearQueueMessages:()=>clearQueueMessages,collectBlobs:()=>collectBlobs,createContainer:()=>createContainer,createQueue:()=>createQueue,createShare:()=>createShare,createShareDirectory:()=>createShareDirectory,createTable:()=>createTable,credential:()=>credential,deleteBlob:()=>deleteBlob,deleteContainer:()=>deleteContainer,deleteEntity:()=>deleteEntity,deleteQueue:()=>deleteQueue,deleteQueueMessage:()=>deleteQueueMessage,deleteShare:()=>deleteShare,deleteShareItem:()=>deleteShareItem,deleteTable:()=>deleteTable,discoveryFailure:()=>discoveryFailure,downloadBlob:()=>downloadBlob,downloadSasBlob:()=>downloadSasBlob,downloadShareFile:()=>downloadShareFile,ensureAccountMeta:()=>ensureAccountMeta,generateBlobSas:()=>generateBlobSas,generateContainerSas:()=>generateContainerSas,getAccountConfig:()=>getAccountConfig,listBlobDirectory:()=>listBlobDirectory,listBlobs:()=>listBlobs,listContainers:()=>listContainers,listQueues:()=>listQueues,listSasBlobs:()=>listSasBlobs,listShareItems:()=>listShareItems,listShares:()=>listShares,listStorageAccounts:()=>listStorageAccounts,listStorageAccountsForSubs:()=>listStorageAccountsForSubs,listStoragePage:()=>listStoragePage,listSubscriptions:()=>listSubscriptions,listTables:()=>listTables,listTenantSubscriptions:()=>listTenantSubscriptions,listTenants:()=>listTenants,openInStorageExplorer:()=>openInStorageExplorer,peekQueueMessages:()=>peekQueueMessages,queryTableEntities:()=>queryTableEntities,registerAccountContext:()=>registerAccountContext,requireNewResource:()=>requireNewResource,resetTokenCache:()=>resetTokenCache,resolveBlobService:()=>resolveBlobService,resolveQueueService:()=>resolveQueueService,resolveShareService:()=>resolveShareService,resolveTableService:()=>resolveTableService,sendQueueMessage:()=>sendQueueMessage,setBlobTier:()=>setBlobTier,signIn:()=>signIn,storageCredential:()=>storageCredential,storageExplorerDeepLink:()=>storageExplorerDeepLink,storageExplorerInstalled:()=>storageExplorerInstalled,storagePage:()=>storagePage,tokenFor:()=>tokenFor,updateQueueMessage:()=>updateQueueMessage,uploadBlob:()=>uploadBlob,uploadShareFile:()=>uploadShareFile,upsertEntity:()=>upsertEntity,warmup:()=>warmup});import{execFile,spawn,spawnSync}from"node:child_process";import{createHash}from"node:crypto";import{accessSync,constants,readFileSync}from"node:fs";import{cp,lstat,mkdir,mkdtemp,readFile,readdir,rename,rm,stat,writeFile}from"node:fs/promises";import os from"node:os";import path from"node:path";import{fileURLToPath}from"node:url";function resolveStudioRoot(moduleUrl){let directory=path.dirname(fileURLToPath(moduleUrl)),candidates=path.basename(directory)==="src"?[directory,path.dirname(directory)]:[directory];for(let candidate of candidates)for(let metadata of["studio-package.json","package.json"])try{return accessSync(path.join(candidate,metadata)),candidate}catch(error){if(error.code!=="ENOENT")throw error}throw new Error(`Missing canvas package metadata for ${moduleUrl}`)}function resolveStudioBuildInfo(moduleUrl,fallbackVersion="unknown"){let version=fallbackVersion,revision="unknown";try{let manifest;try{manifest=readFileSync(new URL("./studio-package.json",moduleUrl),"utf8")}catch(error){if(error.code!=="ENOENT")throw error;manifest=readFileSync(path.join(resolveStudioRoot(moduleUrl),"package.json"),"utf8")}version=JSON.parse(manifest).version||fallbackVersion}catch{}try{revision=createHash("sha256").update(readFileSync(new URL(moduleUrl))).digest("hex").slice(0,10)}catch{}return{version,revision}}var ICONS={vscode:'',github:'',azure:''},COMMAND_BUTTONS=`
+`),clients.add(res),req.on("close",()=>clients.delete(res));return}if(req.method==="GET"&&(req.url==="/"||req.url.startsWith("/?"))){let nonce=randomBytes(16).toString("base64");res.writeHead(200,{"Content-Type":"text/html; charset=utf-8","Content-Security-Policy":cspHeader(nonce),"X-Content-Type-Options":"nosniff","Referrer-Policy":"no-referrer"}),res.end(typeof html=="function"?html(nonce):String(html||""));return}if(req.method==="GET"&&media&&req.url!=="/"&&!req.url.startsWith("/?")){let u=new URL(req.url,"http://127.0.0.1"),out=null;try{out=await media(u.pathname,u.searchParams,ctx)}catch(err){res.writeHead(500,{"Content-Type":"text/plain"}),res.end(String(err?.message||err));return}if(out&&out.buffer){res.writeHead(200,{"Content-Type":out.contentType||"application/octet-stream","Cache-Control":"no-store"}),res.end(out.buffer);return}}if(req.method==="POST"){if(!sameOriginLoopback(req)){res.writeHead(403,{"Content-Type":"application/json"}),res.end(JSON.stringify({ok:!1,error:"cross-origin request blocked"}));return}let path3=req.url.split("?")[0],handler=routes[path3];if(!handler){res.writeHead(404,{"Content-Type":"application/json"}),res.end(JSON.stringify({ok:!1,error:"no route "+path3}));return}let body="",tooLarge=!1;req.on("data",c=>{tooLarge||(body+=c,body.length>MAX_BODY&&(tooLarge=!0,res.writeHead(413,{"Content-Type":"application/json"}),res.end(JSON.stringify({ok:!1,error:"request body too large"})),req.destroy()))}),req.on("end",async()=>{if(tooLarge)return;let payload;try{payload=body?JSON.parse(body):{}}catch{res.writeHead(400,{"Content-Type":"application/json"}),res.end(JSON.stringify({ok:!1,error:"malformed JSON body"}));return}try{let source=req.headers["x-storage-invocation-source"]==="model"?"model":"panel",out=await handler(payload,ctx,source);res.writeHead(200,{"Content-Type":"application/json"}),res.end(JSON.stringify(out??{ok:!0}))}catch(err){res.writeHead(500,{"Content-Type":"application/json"}),res.end(JSON.stringify({ok:!1,error:String(err?.message||err)}))}});return}res.writeHead(404),res.end()});return new Promise(resolve=>{server2.listen(port,"127.0.0.1",()=>{let port2=server2.address().port;resolve({port:port2,url:`http://127.0.0.1:${port2}`,getState,setState,log,close:()=>{for(let res of clients)try{res.end()}catch{}clients.clear(),server2.close()}})})})}async function safe(fn){try{return{ok:!0,data:await fn()}}catch(err){let msg=String(err?.message||err),code=String(err?.code||err?.statusCode||""),{needsAuth,kind}=classifyAuthError(msg,code);return{ok:!1,error:msg,needsAuth,authKind:kind}}}var azure_exports={};__export(azure_exports,{accountMeta:()=>accountMeta,blobSize:()=>blobSize,clearQueueMessages:()=>clearQueueMessages,collectBlobs:()=>collectBlobs,createContainer:()=>createContainer,createQueue:()=>createQueue,createShare:()=>createShare,createShareDirectory:()=>createShareDirectory,createTable:()=>createTable,credential:()=>credential,deleteBlob:()=>deleteBlob,deleteContainer:()=>deleteContainer,deleteEntity:()=>deleteEntity,deleteQueue:()=>deleteQueue,deleteQueueMessage:()=>deleteQueueMessage,deleteShare:()=>deleteShare,deleteShareItem:()=>deleteShareItem,deleteTable:()=>deleteTable,discoveryFailure:()=>discoveryFailure,downloadBlob:()=>downloadBlob,downloadSasBlob:()=>downloadSasBlob,downloadShareFile:()=>downloadShareFile,ensureAccountMeta:()=>ensureAccountMeta,generateBlobSas:()=>generateBlobSas,generateContainerSas:()=>generateContainerSas,getAccountConfig:()=>getAccountConfig,listBlobDirectory:()=>listBlobDirectory,listBlobs:()=>listBlobs,listContainers:()=>listContainers,listQueues:()=>listQueues,listSasBlobs:()=>listSasBlobs,listShareItems:()=>listShareItems,listShares:()=>listShares,listStorageAccounts:()=>listStorageAccounts,listStorageAccountsForSubs:()=>listStorageAccountsForSubs,listStoragePage:()=>listStoragePage,listSubscriptions:()=>listSubscriptions,listTables:()=>listTables,listTenantSubscriptions:()=>listTenantSubscriptions,listTenants:()=>listTenants,openInStorageExplorer:()=>openInStorageExplorer,peekQueueMessages:()=>peekQueueMessages,queryTableEntities:()=>queryTableEntities,registerAccountContext:()=>registerAccountContext,requireNewResource:()=>requireNewResource,resetTokenCache:()=>resetTokenCache,resolveBlobService:()=>resolveBlobService,resolveQueueService:()=>resolveQueueService,resolveShareService:()=>resolveShareService,resolveTableService:()=>resolveTableService,sendQueueMessage:()=>sendQueueMessage,setBlobTier:()=>setBlobTier,signIn:()=>signIn,storageCredential:()=>storageCredential,storageExplorerDeepLink:()=>storageExplorerDeepLink,storageExplorerInstalled:()=>storageExplorerInstalled,storagePage:()=>storagePage,tokenFor:()=>tokenFor,updateQueueMessage:()=>updateQueueMessage,uploadBlob:()=>uploadBlob,uploadShareFile:()=>uploadShareFile,upsertEntity:()=>upsertEntity,warmup:()=>warmup});import{execFile,spawn,spawnSync}from"node:child_process";import{createHash}from"node:crypto";import{accessSync,constants,readFileSync}from"node:fs";import{cp,lstat,mkdir,mkdtemp,readFile,readdir,rename,rm,stat,writeFile}from"node:fs/promises";import os from"node:os";import path from"node:path";import{fileURLToPath}from"node:url";function resolveStudioRoot(moduleUrl){let directory=path.dirname(fileURLToPath(moduleUrl)),candidates=path.basename(directory)==="src"?[directory,path.dirname(directory)]:[directory];for(let candidate of candidates)for(let metadata of["studio-package.json","package.json"])try{return accessSync(path.join(candidate,metadata)),candidate}catch(error){if(error.code!=="ENOENT")throw error}throw new Error(`Missing canvas package metadata for ${moduleUrl}`)}function resolveStudioBuildInfo(moduleUrl,fallbackVersion="unknown"){let version=fallbackVersion,revision="unknown";try{let manifest;try{manifest=readFileSync(new URL("./studio-package.json",moduleUrl),"utf8")}catch(error){if(error.code!=="ENOENT")throw error;manifest=readFileSync(path.join(resolveStudioRoot(moduleUrl),"package.json"),"utf8")}version=JSON.parse(manifest).version||fallbackVersion}catch{}try{revision=createHash("sha256").update(readFileSync(new URL(moduleUrl))).digest("hex").slice(0,10)}catch{}return{version,revision}}var ICONS={vscode:'',github:'',azure:''},COMMAND_BUTTONS=`
`;function canExecuteCommand(file,osName=os.platform()){try{return accessSync(file,osName==="win32"?constants.F_OK:constants.X_OK),!0}catch{return!1}}var WINDOWS_COMMAND_META_CHARACTERS=/([()\][%!^"`<>&|;, *?])/g;function escapeWindowsCommandMetaCharacters(value){return value.replace(WINDOWS_COMMAND_META_CHARACTERS,"^$1")}function assertWindowsCommandValue(value){let text=String(value);if(/[\r\n]/.test(text))throw new Error("Command arguments contain unsupported Windows command characters.");return text}function escapeWindowsCommand(value){return escapeWindowsCommandMetaCharacters(assertWindowsCommandValue(value))}function quoteWindowsCommandArgument(value){let text=assertWindowsCommandValue(value);return text=text.replace(/(?=(\\+?)?)\1"/g,'$1$1\\"'),text=text.replace(/(?=(\\+?)?)\1$/,"$1$1"),escapeWindowsCommandMetaCharacters(`"${text}"`)}function windowsCommandShellLine(command,args=[]){return`"${[escapeWindowsCommand(command),...args.map(quoteWindowsCommandArgument)].join(" ")}"`}function spawnSpecForLocated(located,args,env,osName){return osName==="win32"&&/\.(?:cmd|bat)$/i.test(located.path)?{file:env.ComSpec||env.COMSPEC||path.win32.join(env.SystemRoot||env.SYSTEMROOT||"C:\\Windows","System32","cmd.exe"),args:["/d","/s","/c",windowsCommandShellLine(located.path,args)],env,located,windowsVerbatimArguments:!0}:{file:located.path,args:[...args],env,located,windowsVerbatimArguments:!1}}var AZURE_CLI_ENV_KEYS=["HOME","USER","LOGNAME","TMPDIR","LANG","LC_ALL","SHELL","USERPROFILE","HOMEDRIVE","HOMEPATH","SystemRoot","SYSTEMROOT","TEMP","TMP","ComSpec","COMSPEC","PATHEXT","AZURE_CONFIG_DIR","XDG_CONFIG_HOME","HTTP_PROXY","HTTPS_PROXY","ALL_PROXY","NO_PROXY","http_proxy","https_proxy","all_proxy","no_proxy","REQUESTS_CA_BUNDLE","CURL_CA_BUNDLE","SSL_CERT_FILE","SSL_CERT_DIR","AZURE_CLI_DISABLE_CONNECTION_VERIFICATION"];function sourcePath(source){return source.PATH||source.Path||source.path||""}function locateAzureCli(source=process.env,osName=os.platform(),exists=candidate=>canExecuteCommand(candidate,osName)){let paths=osName==="win32"?path.win32:path.posix,inherited=sourcePath(source).split(paths.delimiter).filter(Boolean),home=source.HOME||source.USERPROFILE||os.homedir(),known=osName==="win32"?[paths.join(source.ProgramFiles||"C:\\Program Files","Microsoft SDKs","Azure","CLI2","wbin"),paths.join(source["ProgramFiles(x86)"]||"C:\\Program Files (x86)","Microsoft SDKs","Azure","CLI2","wbin")]:["/opt/homebrew/bin","/usr/local/bin","/opt/local/bin",paths.join(home,".local","bin"),paths.join(home,"bin"),"/usr/bin","/bin","/snap/bin"],directories=[...new Set([...inherited,...known])],searched=[];if(source.AZURE_CLI_PATH&&(searched.push(source.AZURE_CLI_PATH),exists(source.AZURE_CLI_PATH)))return{found:!0,path:source.AZURE_CLI_PATH,directory:paths.dirname(source.AZURE_CLI_PATH),searched};for(let directory of directories)for(let name of osName==="win32"?["az.cmd","az.exe","az"]:["az"]){let candidate=paths.join(directory,name);if(searched.push(candidate),exists(candidate))return{found:!0,path:candidate,directory,searched}}return{found:!1,path:"",directory:"",searched}}var AzureCliNotFoundError=class extends Error{constructor(searched=[]){super("Azure CLI executable was not found. Install Azure CLI or set AZURE_CLI_PATH to its absolute path, then retry."),this.name="AzureCliNotFoundError",this.code="AZURE_CLI_NOT_FOUND",this.searched=searched}};function azureCliChildEnv(source=process.env,located=locateAzureCli(source),osName=os.platform()){let paths=osName==="win32"?path.win32:path.posix,env={},copied=new Set;for(let key of AZURE_CLI_ENV_KEYS){let identity=osName==="win32"?key.toLowerCase():key;source[key]!=null&&!copied.has(identity)&&(env[key]=source[key],copied.add(identity))}let inherited=sourcePath(source).split(paths.delimiter).filter(Boolean),fallbacks=osName==="win32"?[paths.join(source.SystemRoot||source.SYSTEMROOT||"C:\\Windows","System32"),source.SystemRoot||source.SYSTEMROOT||"C:\\Windows"]:["/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin"];return env.PATH=[...new Set([...located.found?[located.directory]:[],...inherited,...fallbacks])].join(paths.delimiter),osName==="win32"&&!env.ComSpec&&!env.COMSPEC&&(env.ComSpec=paths.join(source.SystemRoot||source.SYSTEMROOT||"C:\\Windows","System32","cmd.exe")),env}function azureCliSpawnSpec(args,{env=process.env,osName=os.platform(),locate=locateAzureCli}={}){assertFixtureAuthenticationDenied("az");let located=locate(env,osName);if(!located.found)throw new AzureCliNotFoundError(located.searched);let childEnv=azureCliChildEnv(env,located,osName);return spawnSpecForLocated(located,args,childEnv,osName)}async function runAzureCliJson(args,subscription,{timeout=3e4,maxBuffer=1024*1024,env=process.env,execute=execFileText,locate=locateAzureCli,osName=os.platform(),signal}={}){let full=subscription?[...args,"--subscription",subscription]:[...args],withFlag=full.includes("--only-show-errors")?full:[...full,"--only-show-errors"],{stdout}=await runAzureCliText(withFlag,{env,maxBuffer,timeout,execute,locate,osName,...signal?{signal}:{}}),text=stdout.trim();return text?JSON.parse(text):null}async function runAzureCliText(args,{env=process.env,execute=execFileText,locate=locateAzureCli,osName=os.platform(),...options}={}){let command=azureCliSpawnSpec(args,{env,locate,osName});return execute(command.file,command.args,{maxBuffer:1024*1024,...options,env:command.env,windowsVerbatimArguments:command.windowsVerbatimArguments})}var fixtureAuthCommands=[];function assertFixtureAuthenticationDenied(command,args=[]){if(process.env.FUNCTION_STUDIO_TEST_MODE!=="1")return;let name=path.win32.basename(String(command)).replace(/\.(?:cmd|bat|exe)$/i,"").toLowerCase(),gitRemote=name==="git"&&args.some(arg=>["clone","fetch","pull","push","ls-remote","credential"].includes(arg)),packageInstall=["npm","npx","pip","pip3","uv"].includes(name)&&args.some(arg=>["install","exec","add","run"].includes(arg))||/^python(?:\d+(?:\.\d+)?)?$/.test(name)&&args.includes("pip")&&args.includes("install");if(!(!gitRemote&&!packageInstall&&!["az","azd","gh","azureauth","security","codesign","npx"].includes(name)))throw fixtureAuthCommands.push(name),new Error(`Live authentication command '${name}' is disabled in Hosted Skills fixture mode. Inject a fake service instead.`)}function execFileText(file,args,options={}){return new Promise((resolve,reject)=>{assertFixtureAuthenticationDenied(file,args),execFile(file,args,{maxBuffer:1024*1024,...options},(error,stdout,stderr)=>{if(error){error.stdout=stdout,error.stderr=stderr,reject(error);return}resolve({stdout,stderr})})})}import{BlobServiceClient,StorageSharedKeyCredential,ContainerClient,generateBlobSASQueryParameters,BlobSASPermissions,ContainerSASPermissions,SASProtocol}from"./sdk/blob.mjs";import{QueueServiceClient,StorageSharedKeyCredential as QueueSharedKey}from"./sdk/queue.mjs";import{ShareServiceClient,StorageSharedKeyCredential as FileSharedKey}from"./sdk/file.mjs";import{TableServiceClient,TableClient,AzureNamedKeyCredential}from"./sdk/tables.mjs";import{spawn as spawn2,spawnSync as spawnSync2}from"node:child_process";import{existsSync}from"node:fs";var ARM="https://management.azure.com",API="2023-01-01";scrubHostSessionEnv();var _credentials=new Map;function credential(tenantId=""){return _credentials.has(tenantId)||_credentials.set(tenantId,{async getToken(scopes,options){if(options?.claims)throw new Error("Azure CLI cannot satisfy this claims challenge. Sign in to the account's tenant and retry.");let args=["account","get-access-token","--scope",...Array.isArray(scopes)?scopes:[scopes],"--output","json"];tenantId&&args.push("--tenant",tenantId);let result=await runAzureCliJson(args,void 0,{env:inheritedCliEnvironment()}),expiresOnTimestamp=result?.expires_on?Number(result.expires_on)*1e3:Date.parse(result?.expiresOn);if(!result?.accessToken||!Number.isFinite(expiresOnTimestamp))throw new Error("Azure CLI returned an invalid access token response. Run `az login` and retry.");return{token:result.accessToken,expiresOnTimestamp}}}),_credentials.get(tenantId)}var _tokens=new Map;async function tokenFor(scope,tenantId="",acquire=credential){let key=JSON.stringify([tenantId,scope]),now=Date.now(),hit=_tokens.get(key);if(hit?.token&&hit.exp-12e4>now)return hit.token;if(hit?.inflight)return hit.inflight;let inflight=acquire(tenantId).getToken(scope).then(t=>{if(!t?.token)throw new Error(`Could not acquire a token for ${scope}. Run \`az login\`.`);return _tokens.set(key,{token:t.token,exp:t.expiresOnTimestamp||now+33e5}),t.token}).catch(e=>{throw _tokens.delete(key),e});return _tokens.set(key,{...hit||{},inflight}),inflight}function storageCredential(account){if(!accountMeta(account)&&!knownAccount(account))throw new Error(`Storage account '${account}' has no known subscription or tenant context. Select its subscription before accessing storage.`);return{getToken:async(scopes,options)=>{let{tenantId}=await ensureAccountMeta(account);if(options?.claims)return credential(tenantId).getToken(scopes,options);let scope=Array.isArray(scopes)?scopes[0]:scopes;return{token:await tokenFor(scope,tenantId),expiresOnTimestamp:_tokens.get(JSON.stringify([tenantId,scope]))?.exp??Date.now()+33e5}}}}var _warmed=null;function warmup(){return _warmed||(_warmed=Promise.allSettled([tokenFor("https://management.azure.com/.default"),tokenFor("https://storage.azure.com/.default")]),_warmed)}function resetTokenCache(){_tokens.clear(),_credentials.clear(),svcCache.clear(),queueCache.clear(),tableCache.clear(),shareCache.clear(),_warmed=null}function azMissingMsg(e){let m=String(e&&e.message||e);return/ENOENT/i.test(m)?"Azure CLI (az) was not found on PATH. Install it from aka.ms/azure-cli, then try again, or run `az login` manually.":"Could not start az login: "+m}var _signInInflight=null;function signIn(opts={}){return _signInInflight||(_signInInflight=_doSignIn(opts).finally(()=>{_signInInflight=null}),_signInInflight)}function _doSignIn({tenantId,timeoutMs=18e4,_spawn=spawn2}={}){return new Promise(resolve=>{let isWin=process.platform==="win32",env={...inheritedCliEnvironment(),AZURE_CORE_LOGIN_EXPERIENCE_V2:"off"},child;try{child=_spawn("az",["login","--only-show-errors",...tenantId?["--tenant",tenantId]:[]],{env,windowsHide:!0,shell:isWin,stdio:["ignore","ignore","pipe"]})}catch(e){resolve({ok:!1,error:azMissingMsg(e)});return}let err="";child.stderr&&child.stderr.on("data",d=>{err+=String(d)});let timer=setTimeout(()=>{try{child.kill()}catch{}resolve({ok:!1,error:"Sign-in timed out after 3 minutes. Finish az login in the browser, then click Refresh."})},timeoutMs);child.on("error",e=>{clearTimeout(timer),resolve({ok:!1,error:azMissingMsg(e)})}),child.on("close",code=>{if(clearTimeout(timer),code===0){resetTokenCache(),resolve({ok:!0});return}resolve({ok:!1,error:err.trim()||"az login exited with code "+code})})})}var SE_RESOURCE_TYPE={blob:"Azure.BlobContainer",file:"Azure.FileShare",queue:"Azure.Queue",table:"Azure.Table"};function storageExplorerDeepLink({account,kind,item}={}){let m=account?accountMeta(account):null;if(!m||!m.subscriptionId||!m.resourceGroup)return null;let accountId=`/subscriptions/${m.subscriptionId}/resourceGroups/${m.resourceGroup}/providers/Microsoft.Storage/storageAccounts/${m.name}`,link="storageexplorer://v=1&accountid="+encodeURIComponent(accountId)+"&subscriptionid="+encodeURIComponent(m.subscriptionId),rt=kind?SE_RESOURCE_TYPE[kind]:null;return rt&&item&&(link+="&resourcetype="+encodeURIComponent(rt)+"&resourcename="+encodeURIComponent(item)),link}function storageExplorerExe(){if(process.platform!=="win32")return null;let candidates=[process.env.LOCALAPPDATA&&process.env.LOCALAPPDATA+"\\Programs\\Microsoft Azure Storage Explorer\\StorageExplorer.exe",process.env.ProgramFiles&&process.env.ProgramFiles+"\\Microsoft Azure Storage Explorer\\StorageExplorer.exe",process.env["ProgramFiles(x86)"]&&process.env["ProgramFiles(x86)"]+"\\Microsoft Azure Storage Explorer\\StorageExplorer.exe"].filter(Boolean);for(let p of candidates)try{if(existsSync(p))return p}catch{}return null}var SE_DOWNLOAD="https://aka.ms/storageexplorer",_seInstalled;function storageExplorerInstalled(){if(_seInstalled!==void 0)return _seInstalled;if(storageExplorerExe())return _seInstalled=!0;if(process.platform==="win32"){for(let key of["HKCU\\Software\\Classes\\storageexplorer","HKCR\\storageexplorer"])try{let r=spawnSync2("reg",["query",key],{stdio:"ignore",windowsHide:!0});if(r&&r.status===0)return _seInstalled=!0}catch{}return _seInstalled=!1}return _seInstalled=null}function openBrowser(url){let opts={detached:!0,stdio:"ignore"},file,args;process.platform==="win32"?(file=process.env.ComSpec||"cmd.exe",args=["/c","start","",url]):process.platform==="darwin"?(file="open",args=[url]):(file="xdg-open",args=[url]);try{let c=spawn2(file,args,opts);c.on("error",()=>{}),c.unref&&c.unref()}catch{}}function seMissingMsg(e){let m=String(e&&e.message||e);return/ENOENT/i.test(m)?"Azure Storage Explorer isn't installed. Get the free desktop app at "+SE_DOWNLOAD+".":"Could not launch Azure Storage Explorer: "+m}function openInStorageExplorer({account,kind,item}={}){return new Promise(resolve=>{if(storageExplorerInstalled()===!1){openBrowser(SE_DOWNLOAD),resolve({ok:!1,notInstalled:!0,install:SE_DOWNLOAD});return}let link=storageExplorerDeepLink({account,kind,item}),exe=storageExplorerExe(),opts={detached:!0,stdio:"ignore"},file,args;if(exe)file=exe,args=link?[link]:[];else if(process.platform==="win32"){if(!link){openBrowser(SE_DOWNLOAD),resolve({ok:!1,notInstalled:!0,install:SE_DOWNLOAD});return}file=process.env.ComSpec||"cmd.exe",args=["/c","start","",link]}else process.platform==="darwin"?(file="open",args=link?[link]:["-a","Microsoft Azure Storage Explorer"]):(file="StorageExplorer",args=link?[link]:[]);let onFail=e=>{if(e&&/ENOENT/i.test(String(e.message||e))){openBrowser(SE_DOWNLOAD),resolve({ok:!1,notInstalled:!0,install:SE_DOWNLOAD});return}resolve({ok:!1,error:seMissingMsg(e)})},child;try{child=spawn2(file,args,opts)}catch(e){onFail(e);return}child.on("error",onFail),child.on("spawn",()=>{try{child.unref()}catch{}resolve({ok:!0,deepLink:!!link})})})}async function armToken(tenantId){return tokenFor("https://management.azure.com/.default",tenantId)}async function armGet(path3,tenantId){let res=await fetch(`${ARM}${path3}`,{headers:{Authorization:`Bearer ${await armToken(tenantId)}`}});if(!res.ok){let e=new Error(`ARM GET ${path3} \u2192 HTTP ${res.status}`);throw e.statusCode=res.status,e}return res.json()}async function armPost(path3,tenantId){let res=await fetch(`${ARM}${path3}`,{method:"POST",headers:{Authorization:`Bearer ${await armToken(tenantId)}`}});if(!res.ok){let e=new Error(`ARM POST ${path3} \u2192 HTTP ${res.status}`);throw e.statusCode=res.status,e}return res.json()}async function armGetAll(path3,tenantId){let token=await armToken(tenantId),url=path3.startsWith("http")?path3:`${ARM}${path3}`,items=[];for(;url;){let res=await fetch(url,{headers:{Authorization:`Bearer ${token}`}});if(!res.ok){let e=new Error(`ARM GET ${url} \u2192 HTTP ${res.status}`);throw e.statusCode=res.status,e}let j=await res.json();if(Array.isArray(j.value))for(let v of j.value)items.push(v);url=j.nextLink||j["@odata.nextLink"]||null}return items}async function listSubscriptions({runCli=runAzureCliJson}={}){let value=await runCli(["account","list","--all","--output","json"],void 0,{env:inheritedCliEnvironment()});if(!Array.isArray(value))throw new Error("Azure CLI returned an invalid subscription list.");if(value.some(s=>s.id&&!s.tenantId))throw new Error("Azure CLI returned a subscription without a tenant. Refresh your Azure CLI login.");return value.filter(s=>s.id).map(s=>({subscriptionId:s.id,displayName:s.name,tenantId:s.tenantId,state:s.state}))}async function listTenants({read=armGetAll}={}){return(await read("/tenants?api-version=2022-12-01")).map(t=>({tenantId:t.tenantId,displayName:t.displayName||t.defaultDomain||"Unnamed directory",defaultDomain:t.defaultDomain||"",current:!0}))}async function listTenantSubscriptions(tenantId,{read=armGetAll}={}){if(!tenantId)throw new Error("A tenant is required.");return(await read("/subscriptions?api-version=2022-12-01",tenantId)).map(s=>({subscriptionId:s.subscriptionId,displayName:s.displayName,tenantId,state:s.state}))}function discoveryFailure(error){let text=String(error?.message||error),auth=classifyAuthError(text),status=error?.statusCode||/\bHTTP (\d{3})\b/.exec(text)?.[1];return{error:text,needsAuth:auth.needsAuth,message:humanErrorSummary(text,auth.needsAuth,status)}}var accountIndex=new Map,accountContexts=new Set,accountResolutions=new Map;function registerAccountContext(getContext){return accountContexts.add(getContext),()=>accountContexts.delete(getContext)}function knownAccount(account){for(let getContext of[...accountContexts].reverse()){let{accounts=[],subscriptions=[]}=getContext(),metadata=accounts.find(a=>a.name===account);if(metadata)return{metadata,subscription:subscriptions.find(s=>s.subscriptionId===metadata.subscriptionId)}}return null}function completeAccount(metadata){return!!(metadata?.tenantId&&metadata.subscriptionId&&metadata.resourceGroup)}function rgFromId(id){let m=/\/resourceGroups\/([^/]+)\//i.exec(id||"");return m?m[1]:""}async function mapLimit(items,limit,fn){let results=[],i=0,workers=Array.from({length:Math.min(limit,items.length)},async()=>{for(;i`${e.subscriptionName}: ${e.error}`).join("; "));return accounts}async function listStorageAccountsForSubs(subs,{concurrency=16,readAccounts=armGetAll}={}){let out=[],errors=[];return await mapLimit(subs,concurrency,async sub=>{let accts;try{if(!sub.tenantId)throw new Error("Subscription tenant is unknown. Refresh subscriptions.");accts=await readAccounts(`/subscriptions/${sub.subscriptionId}/providers/Microsoft.Storage/storageAccounts?api-version=${API}`,sub.tenantId)}catch(e){errors.push({subscriptionName:sub.displayName||sub.subscriptionId,subscriptionId:sub.subscriptionId,tenantId:sub.tenantId,...discoveryFailure(e)});return}for(let a of accts){let acct={name:a.name,subscriptionId:sub.subscriptionId,subscriptionName:sub.displayName,tenantId:sub.tenantId,resourceGroup:rgFromId(a.id),location:a.location||"",sku:a.sku?.name||"",kind:a.kind||""};accountIndex.set(a.name,acct),out.push(acct)}}),out.sort((x,y)=>x.name.localeCompare(y.name)),{accounts:out,errors}}function accountMeta(account){let cached=accountIndex.get(account);if(completeAccount(cached))return cached;let known=knownAccount(account);if(!known)return cached||null;let metadata={...known.metadata,tenantId:known.metadata.tenantId||known.subscription?.tenantId,resourceGroup:known.metadata.resourceGroup||rgFromId(known.metadata.id)};return completeAccount(metadata)?(accountIndex.set(account,metadata),metadata):cached||null}async function ensureAccountMeta(account,{readAccounts=armGetAll}={}){let cached=accountMeta(account);if(completeAccount(cached))return cached;if(accountResolutions.has(account))return accountResolutions.get(account);let known=knownAccount(account),subscriptionId=known?.metadata.subscriptionId,tenantId=known?.metadata.tenantId||known?.subscription?.tenantId;if(!subscriptionId||!tenantId)throw new Error(`Storage account '${account}' has no known subscription or tenant context. Select its subscription before accessing storage.`);let pending=(async()=>{let result=await listStorageAccountsForSubs([{...known.subscription,subscriptionId,tenantId}],{readAccounts});if(result.errors.length)throw new Error(`Could not resolve storage account '${account}': ${result.errors[0].error}`);let resolved=result.accounts.find(a=>a.name===account);if(!completeAccount(resolved))throw new Error(`Storage account '${account}' was not returned with complete metadata in subscription '${subscriptionId}'. Refresh that subscription's accounts.`);return resolved})();accountResolutions.set(account,pending);try{return await pending}finally{accountResolutions.get(account)===pending&&accountResolutions.delete(account)}}async function getAccountConfig(account){try{let m=await ensureAccountMeta(account),j=await armGet(`/subscriptions/${m.subscriptionId}/resourceGroups/${m.resourceGroup}/providers/Microsoft.Storage/storageAccounts/${account}?api-version=${API}`,m.tenantId),p=j.properties||{};return{ok:!0,exists:!0,allowSharedKeyAccess:p.allowSharedKeyAccess!==!1,publicNetworkAccess:p.publicNetworkAccess||"Enabled",defaultAction:p.networkAcls?.defaultAction||"Allow",provisioningState:p.provisioningState||"",sku:j.sku?.name||"",location:j.location||""}}catch(err){return err.statusCode===404?{ok:!0,exists:!1}:{ok:!1,error:String(err?.message||err)}}}async function fetchAccountKey(account){let m=await ensureAccountMeta(account),key=(await armPost(`/subscriptions/${m.subscriptionId}/resourceGroups/${m.resourceGroup}/providers/Microsoft.Storage/storageAccounts/${account}/listKeys?api-version=${API}`,m.tenantId))?.keys?.[0]?.value;if(!key)throw new Error("listKeys returned no key");return key}var svcCache=new Map;function accountUrl(account){return`https://${account}.blob.core.windows.net`}async function probe(svc){await svc.listContainers().byPage({maxPageSize:1})[Symbol.asyncIterator]().next()}function isAuthError(e){let s=e?.statusCode??e?.response?.status;if(s===401||s===403)return!0;let txt=`${e?.code||e?.name||""} ${e?.message||""}`;return/Authoriz|Authentic|KeyBasedAuthenticationNotPermitted|InvalidAuthenticationInfo|NoAuthenticationInformation/i.test(txt)}async function buildEntry(account){await ensureAccountMeta(account);try{let key=await fetchAccountKey(account);return{svc:new BlobServiceClient(accountUrl(account),new StorageSharedKeyCredential(account,key)),mode:"sharedKey",key}}catch{return{svc:new BlobServiceClient(accountUrl(account),storageCredential(account)),mode:"aad",key:null}}}async function withBlob(account,fn){let entry=svcCache.get(account);entry||(entry=await buildEntry(account),svcCache.set(account,entry));try{return await fn(entry.svc)}catch(e){if(entry.mode==="sharedKey"&&isAuthError(e)){let aad={svc:new BlobServiceClient(accountUrl(account),storageCredential(account)),mode:"aad",key:null};return svcCache.set(account,aad),await fn(aad.svc)}throw e}}async function resolveBlobService(account){if(await ensureAccountMeta(account),svcCache.has(account))return svcCache.get(account);let keyErr=null,aadErr=null;try{let key=await fetchAccountKey(account),cred=new StorageSharedKeyCredential(account,key),svc=new BlobServiceClient(accountUrl(account),cred);await probe(svc);let entry={svc,mode:"sharedKey",key};return svcCache.set(account,entry),entry}catch(err){keyErr=err}try{let svc=new BlobServiceClient(accountUrl(account),storageCredential(account));await probe(svc);let entry={svc,mode:"aad",key:null};return svcCache.set(account,entry),entry}catch(err){aadErr=err}throw new Error(`Could not access '${account}': key fallback ${keyErr?.code||keyErr?.message||"n/a"}; AAD ${aadErr?.code||aadErr?.message||"n/a"}.`)}async function listContainers(account){return withBlob(account,async svc=>{let out=[];for await(let c of svc.listContainers())out.push({name:c.name,lastModified:c.properties?.lastModified||null});return out})}function mapBlob(b){return{name:b.name,size:b.properties?.contentLength??0,lastModified:b.properties?.lastModified?new Date(b.properties.lastModified).toISOString():null,contentType:b.properties?.contentType||"",accessTier:b.properties?.accessTier||"",blobType:b.properties?.blobType||"",tags:b.tags||null}}async function collectBlobs(cc,max,{prefix,onProgress,requireTags=!1}={}){let out=[],truncated=!1,read=async includeTags=>{for await(let b of cc.listBlobsFlat({prefix,includeTags})){if(out.length>=max){truncated=!0;break}out.push(mapBlob(b)),out.length%1e3===0&&onProgress?.(out.length)}onProgress?.(out.length)};try{await read(!0)}catch(error){if(error?.statusCode!==403||requireTags)throw error;out.length=0,truncated=!1,onProgress?.(0),await read(!1)}return out.truncated=truncated,out.limit=max,out}async function listBlobs(account,container,{max=5e3,complete=!1,...options}={}){return withBlob(account,svc=>collectBlobs(svc.getContainerClient(container),complete?1/0:max,options))}async function listBlobDirectory(account,container,{prefix="",max=5e3,list}={}){let collect=async(cc,includeTags)=>{let blobs=[],prefixes=[],truncated=!1;for await(let item of cc.listBlobsByHierarchy("/",{prefix,includeTags})){if(blobs.length+prefixes.length>=max){truncated=!0;break}item.kind==="prefix"?prefixes.push(item.name):blobs.push(mapBlob(item))}return{blobs,prefixes,truncated,limit:max}},read=async cc=>{try{return await collect(cc,!0)}catch(error){if(error?.statusCode!==403)throw error;return collect(cc,!1)}};return list?read({listBlobsByHierarchy:list}):withBlob(account,svc=>read(svc.getContainerClient(container)))}async function storagePage(iterator,continuationToken,maxPageSize=100){let result=await iterator.byPage({continuationToken:continuationToken||void 0,maxPageSize}).next();return result.done?{page:[],nextToken:null}:{page:result.value,nextToken:result.value.continuationToken||null}}async function listStoragePage({account,kind,resource,dir="",prefix="",token,sasUrl,resolve,tableClient}){let read=iterator=>storagePage(iterator,token);if(kind==="blob"||kind==="sas"){let fromClient=async svc=>{let cc=kind==="sas"?svc:resource?svc.getContainerClient(resource):null;if(!cc){let{page,nextToken}=await read(svc.listContainers());return{items:(page.containerItems||[]).map(c=>({name:c.name,lastModified:c.properties?.lastModified||null})),nextToken}}let result;try{result=await read(kind==="sas"?cc.listBlobsFlat({includeTags:!0}):cc.listBlobsByHierarchy("/",{prefix,includeTags:!0}))}catch(error){if(error?.statusCode!==403)throw error;result=await read(kind==="sas"?cc.listBlobsFlat():cc.listBlobsByHierarchy("/",{prefix}))}return{items:(result.page.segment?.blobItems||[]).map(mapBlob),prefixes:(result.page.segment?.blobPrefixes||[]).map(p=>p.name),nextToken:result.nextToken}};return kind==="sas"?fromClient(new ContainerClient(sasUrl)):resolve?fromClient((await resolve(account)).svc):withBlob(account,fromClient)}if(kind==="file"){let{svc}=await(resolve||resolveShareService)(account),{page,nextToken}=await read(resource?svc.getShareClient(resource).getDirectoryClient(dir).listFilesAndDirectories({includeTimestamps:!0}):svc.listShares());return{items:resource?[...(page.segment?.directoryItems||[]).map(x=>({name:x.name,kind:"directory",size:null,lastModified:null})),...(page.segment?.fileItems||[]).map(x=>({name:x.name,kind:"file",size:x.properties?.contentLength??0,lastModified:x.properties?.lastModified?new Date(x.properties.lastModified).toISOString():null}))]:(page.shareItems||[]).map(x=>({name:x.name,quotaGiB:x.properties?.quota??null})),nextToken}}if(kind==="queue"){let{svc}=await(resolve||resolveQueueService)(account),{page,nextToken}=await read(svc.listQueues());return{items:(page.queueItems||[]).map(x=>({name:x.name,approximateMessagesCount:null})),nextToken}}if(kind==="table"){let{svc,cred}=await(resolve||resolveTableService)(account),{page,nextToken}=await read(resource?(tableClient||new TableClient(tableUrl(account),resource,cred)).listEntities():svc.listTables());if(!resource)return{items:page.map(x=>({name:x.name})),nextToken};let columns=new Set(["partitionKey","rowKey","timestamp"]);return{entities:{rows:page.map(ent=>{let row={};for(let[key,value]of Object.entries(ent))key.startsWith("odata.")||key==="etag"||(columns.add(key),row[key]=value&&typeof value.toISOString=="function"?value.toISOString():value);return row}),columns:[...columns]},nextToken}}throw new Error("This storage view does not support continuation pages.")}async function createContainer(account,container,{resolve=resolveBlobService}={}){let{svc}=await resolve(account);return await svc.getContainerClient(container).create(),{ok:!0,container}}async function deleteContainer(account,container){let{svc}=await resolveBlobService(account);return await svc.getContainerClient(container).delete(),{ok:!0}}async function deleteBlob(account,container,name){let{svc}=await resolveBlobService(account);return await svc.getContainerClient(container).getBlockBlobClient(name).delete(),{ok:!0}}async function setBlobTier(account,container,name,tier){let{svc}=await resolveBlobService(account);return await svc.getContainerClient(container).getBlockBlobClient(name).setAccessTier(tier),{ok:!0}}async function uploadBlob(account,container,name,buffer,contentType){let{svc}=await resolveBlobService(account),cc=svc.getContainerClient(container);return await cc.createIfNotExists(),await cc.getBlockBlobClient(name).uploadData(buffer,contentType?{blobHTTPHeaders:{blobContentType:contentType}}:void 0),{ok:!0,name,size:buffer.length}}async function downloadBlob(account,container,name,{maxBytes=null}={}){let{svc}=await resolveBlobService(account),bc=svc.getContainerClient(container).getBlockBlobClient(name);if(Number.isFinite(maxBytes)&&maxBytes>0){let resp=await bc.download(0,maxBytes);return await streamToBuffer(resp.readableStreamBody)}return await bc.downloadToBuffer()}async function blobSize(account,container,name){let{svc}=await resolveBlobService(account),props=await svc.getContainerClient(container).getBlockBlobClient(name).getProperties();return Number(props.contentLength)||0}async function streamToBuffer(stream){let chunks=[];for await(let chunk of stream)chunks.push(Buffer.isBuffer(chunk)?chunk:Buffer.from(chunk));return Buffer.concat(chunks)}async function generateBlobSas(account,container,name,{minutes=60,permissions="r"}={}){let entry=await resolveBlobService(account),perms=BlobSASPermissions.parse(permissions||"r"),startsOn=new Date(Date.now()-5*6e4),expiresOn=new Date(Date.now()+Math.max(1,minutes)*6e4),common={containerName:container,blobName:name,permissions:perms,startsOn,expiresOn,protocol:SASProtocol.Https},sas,mode;if(entry.mode==="sharedKey"&&entry.key){let cred=new StorageSharedKeyCredential(account,entry.key);sas=generateBlobSASQueryParameters(common,cred).toString(),mode="account-key"}else{let udk=await entry.svc.getUserDelegationKey(startsOn,expiresOn);sas=generateBlobSASQueryParameters(common,udk,account).toString(),mode="user-delegation"}let encName=name.split("/").map(encodeURIComponent).join("/");return{url:`${accountUrl(account)}/${container}/${encName}?${sas}`,expiresOn:expiresOn.toISOString(),permissions:permissions||"r",mode}}async function generateContainerSas(account,container,{minutes=1440,permissions="rl"}={}){let entry=await resolveBlobService(account),perms=ContainerSASPermissions.parse(permissions||"rl"),startsOn=new Date(Date.now()-5*6e4),expiresOn=new Date(Date.now()+Math.max(1,minutes)*6e4),common={containerName:container,permissions:perms,startsOn,expiresOn,protocol:SASProtocol.Https},sas,mode;if(entry.mode==="sharedKey"&&entry.key){let cred=new StorageSharedKeyCredential(account,entry.key);sas=generateBlobSASQueryParameters(common,cred).toString(),mode="account-key"}else{let udk=await entry.svc.getUserDelegationKey(startsOn,expiresOn);sas=generateBlobSASQueryParameters(common,udk,account).toString(),mode="user-delegation"}return{url:`${accountUrl(account)}/${container}?${sas}`,expiresOn:expiresOn.toISOString(),permissions:permissions||"rl",mode}}async function listSasBlobs(sasUrl,{max=5e3,complete=!1,...options}={}){let cc=new ContainerClient(sasUrl);return collectBlobs(cc,complete?1/0:max,options)}async function downloadSasBlob(sasUrl,name){return await new ContainerClient(sasUrl).getBlockBlobClient(name).downloadToBuffer()}var queueCache=new Map;function queueUrl(account){return`https://${account}.queue.core.windows.net`}async function resolveQueueService(account){if(await ensureAccountMeta(account),queueCache.has(account))return queueCache.get(account);let keyErr=null;try{let key=await fetchAccountKey(account),svc=new QueueServiceClient(queueUrl(account),new QueueSharedKey(account,key));await svc.listQueues().byPage({maxPageSize:1})[Symbol.asyncIterator]().next();let e={svc,mode:"sharedKey"};return queueCache.set(account,e),e}catch(err){keyErr=err}try{let svc=new QueueServiceClient(queueUrl(account),storageCredential(account));await svc.listQueues().byPage({maxPageSize:1})[Symbol.asyncIterator]().next();let e={svc,mode:"aad"};return queueCache.set(account,e),e}catch(err){throw new Error(`Could not access queues for '${account}': key ${keyErr?.code||keyErr?.message||"n/a"}; AAD ${err?.code||err?.message||"n/a"}.`)}}async function listQueues(account){let{svc}=await resolveQueueService(account),out=[];for await(let q of svc.listQueues()){let count=null;try{count=(await svc.getQueueClient(q.name).getProperties()).approximateMessagesCount??null}catch{}out.push({name:q.name,approximateMessagesCount:count})}return out}async function peekQueueMessages(account,queue,{max=32}={}){let{svc}=await resolveQueueService(account);return((await svc.getQueueClient(queue).peekMessages({numberOfMessages:Math.min(max,32)})).peekedMessageItems||[]).map(m=>({messageId:m.messageId,messageText:m.messageText,insertedOn:m.insertedOn?new Date(m.insertedOn).toISOString():null,dequeueCount:m.dequeueCount??0}))}function requireNewResource(items,name,kind){if(items.some(item=>item.name.toLowerCase()===name.toLowerCase()))throw new Error(`A ${kind} named "${name}" already exists. Choose a different name.`)}async function createQueue(account,queue){requireNewResource(await listQueues(account),queue,"queue");let{svc}=await resolveQueueService(account);return await svc.getQueueClient(queue).create(),{ok:!0}}async function deleteQueue(account,queue){let{svc}=await resolveQueueService(account);return await svc.getQueueClient(queue).delete(),{ok:!0}}async function sendQueueMessage(account,queue,text){let{svc}=await resolveQueueService(account);return{ok:!0,messageId:(await svc.getQueueClient(queue).sendMessage(String(text??""))).messageId}}async function clearQueueMessages(account,queue){let{svc}=await resolveQueueService(account);return await svc.getQueueClient(queue).clearMessages(),{ok:!0}}async function withReceivedMessage(account,queue,messageId,act){let{svc}=await resolveQueueService(account),qc=svc.getQueueClient(queue),msgs=(await qc.receiveMessages({numberOfMessages:32,visibilityTimeout:30})).receivedMessageItems||[],target=msgs.find(m=>m.messageId===messageId);for(let m of msgs)if(m.messageId!==messageId)try{await qc.updateMessage(m.messageId,m.popReceipt,void 0,0)}catch{}if(!target)throw new Error("That message isn't among the first 32 in the queue, so it can't be changed directly.");return await act(qc,target),{ok:!0}}async function updateQueueMessage(account,queue,messageId,text){return withReceivedMessage(account,queue,messageId,(qc,target)=>qc.updateMessage(messageId,target.popReceipt,String(text??""),0))}async function deleteQueueMessage(account,queue,messageId){return withReceivedMessage(account,queue,messageId,(qc,target)=>qc.deleteMessage(messageId,target.popReceipt))}var tableCache=new Map;function tableUrl(account){return`https://${account}.table.core.windows.net`}async function resolveTableService(account){if(await ensureAccountMeta(account),tableCache.has(account))return tableCache.get(account);let keyErr=null;try{let key=await fetchAccountKey(account),cred=new AzureNamedKeyCredential(account,key),svc=new TableServiceClient(tableUrl(account),cred);await svc.listTables().byPage({maxPageSize:1})[Symbol.asyncIterator]().next();let e={svc,mode:"sharedKey",cred};return tableCache.set(account,e),e}catch(err){keyErr=err}try{let cred=storageCredential(account),svc=new TableServiceClient(tableUrl(account),cred);await svc.listTables().byPage({maxPageSize:1})[Symbol.asyncIterator]().next();let e={svc,mode:"aad",cred};return tableCache.set(account,e),e}catch(err){throw new Error(`Could not access tables for '${account}': key ${keyErr?.code||keyErr?.message||"n/a"}; AAD ${err?.code||err?.message||"n/a"}.`)}}async function listTables(account){let{svc}=await resolveTableService(account),out=[];for await(let t of svc.listTables())out.push({name:t.name});return out}async function queryTableEntities(account,table,{max=100}={}){let{cred}=await resolveTableService(account),tc=new TableClient(tableUrl(account),table,cred),rows=[],cols=new Set(["partitionKey","rowKey","timestamp"]);for await(let ent of tc.listEntities()){let row={};for(let k of Object.keys(ent)){if(k.startsWith("odata.")||k==="etag")continue;cols.add(k);let v=ent[k];row[k]=v&&typeof v=="object"&&typeof v.toISOString=="function"?v.toISOString():v}if(rows.push(row),rows.length>=max)break}return{columns:Array.from(cols),rows}}async function createTable(account,table){requireNewResource(await listTables(account),table,"table");let{svc}=await resolveTableService(account);return await svc.createTable(table),{ok:!0}}async function deleteTable(account,table){let{svc}=await resolveTableService(account);return await svc.deleteTable(table),{ok:!0}}async function upsertEntity(account,table,entity){if(!entity||!entity.partitionKey||!entity.rowKey)throw new Error("entity requires partitionKey and rowKey");let{cred}=await resolveTableService(account);return await new TableClient(tableUrl(account),table,cred).upsertEntity(entity,"Merge"),{ok:!0}}async function deleteEntity(account,table,partitionKey,rowKey){let{cred}=await resolveTableService(account);return await new TableClient(tableUrl(account),table,cred).deleteEntity(partitionKey,rowKey),{ok:!0}}var shareCache=new Map;function fileUrl(account){return`https://${account}.file.core.windows.net`}async function resolveShareService(account){if(await ensureAccountMeta(account),shareCache.has(account))return shareCache.get(account);let keyErr=null;try{let key=await fetchAccountKey(account),svc=new ShareServiceClient(fileUrl(account),new FileSharedKey(account,key));await svc.listShares().byPage({maxPageSize:1})[Symbol.asyncIterator]().next();let e={svc,mode:"sharedKey"};return shareCache.set(account,e),e}catch(err){keyErr=err}try{let svc=new ShareServiceClient(fileUrl(account),storageCredential(account),{fileRequestIntent:"backup"});await svc.listShares().byPage({maxPageSize:1})[Symbol.asyncIterator]().next();let e={svc,mode:"aad"};return shareCache.set(account,e),e}catch(err){throw new Error(`Could not access file shares for '${account}': key ${keyErr?.code||keyErr?.message||"n/a"}; AAD ${err?.code||err?.message||"n/a"}.`)}}async function listShares(account){let{svc}=await resolveShareService(account),out=[];for await(let s of svc.listShares())out.push({name:s.name,quotaGiB:s.properties?.quota??null});return out}async function listShareItems(account,share,dir="",{resolve=resolveShareService}={}){let{svc}=await resolve(account),dc=svc.getShareClient(share).getDirectoryClient(dir||""),out=[];for await(let item of dc.listFilesAndDirectories({includeTimestamps:!0}))out.push({name:item.name,kind:item.kind,size:item.kind==="file"?item.properties?.contentLength??0:null,lastModified:item.kind==="file"&&item.properties?.lastModified?new Date(item.properties.lastModified).toISOString():null});return out}async function createShare(account,share){requireNewResource(await listShares(account),share,"file share");let{svc}=await resolveShareService(account);return await svc.getShareClient(share).create(),{ok:!0}}async function deleteShare(account,share){let{svc}=await resolveShareService(account);return await svc.getShareClient(share).delete(),{ok:!0}}async function createShareDirectory(account,share,dir){let{svc}=await resolveShareService(account);return await svc.getShareClient(share).getDirectoryClient(dir).create(),{ok:!0}}async function uploadShareFile(account,share,name,buffer,dir="",{resolve=resolveShareService}={}){let{svc}=await resolve(account),fc=svc.getShareClient(share).getDirectoryClient(dir).getFileClient(name);return await fc.create(buffer.length),buffer.length&&await fc.uploadData(buffer),{ok:!0,size:buffer.length}}async function downloadShareFile(account,share,name,dir="",{resolve=resolveShareService}={}){let{svc}=await resolve(account);return await svc.getShareClient(share).getDirectoryClient(dir).getFileClient(name).downloadToBuffer()}async function deleteShareItem(account,share,name,kind,dir="",{resolve=resolveShareService}={}){let{svc}=await resolve(account),sc=svc.getShareClient(share);return kind==="directory"?await sc.getDirectoryClient(dir?`${dir}/${name}`:name).delete():await sc.getDirectoryClient(dir).getFileClient(name).delete(),{ok:!0}}function fmtBytes(n){if(n=Number(n)||0,n<1024)return`${n} B`;let u=["KB","MB","GB","TB","PB"],i=-1;do n/=1024,i++;while(n>=1024&&i=10?0:1)} ${u[i]}`}function globToRe(glob){let body=String(glob).replace(/[.+^${}()|[\]\\]/g,"\\$&").replace(/\*/g,".*").replace(/\?/g,".");return new RegExp("^"+body+"$","i")}function typeFamily(contentType,name){let ct=String(contentType||"").toLowerCase(),ext=String(name||"").toLowerCase().split(".").pop();return/^image\//.test(ct)||/^(png|jpe?g|gif|webp|bmp|svg|tiff?)$/.test(ext)?"image":/^video\//.test(ct)||/^(mp4|mov|avi|mkv|webm)$/.test(ext)?"video":/^audio\//.test(ct)||/^(mp3|wav|flac|ogg|m4a)$/.test(ext)?"audio":/json|xml|csv|text\/|javascript|yaml/.test(ct)||/^(json|xml|csv|txt|log|md|yaml|yml|js|ts|html?|css)$/.test(ext)?"text/data":/pdf|word|excel|powerpoint|officedocument|msword/.test(ct)||/^(pdf|docx?|xlsx?|pptx?)$/.test(ext)?"document":/zip|gzip|tar|compress|x-7z|rar/.test(ct)||/^(zip|gz|tar|7z|rar|bz2)$/.test(ext)?"archive":/octet-stream/.test(ct)||/^(bin|dat|iso|vhd|img)$/.test(ext)?"binary":ct.split("/")[0]||"other"}function applyBlobFilter(blobs,c={}){let list=Array.isArray(blobs)?blobs:[],nowMs=c.now?Date.parse(c.now):Date.now(),re=c.namePattern&&String(c.namePattern).trim()?globToRe(String(c.namePattern).trim()):null,prefix=c.prefix!=null&&String(c.prefix)!==""?String(c.prefix).toLowerCase():null,suffix=c.suffix!=null&&String(c.suffix)!==""?String(c.suffix).toLowerCase():null,contains=c.contains!=null&&String(c.contains)!==""?String(c.contains).toLowerCase():null,min=c.minSize!=null&&c.minSize!==""?Number(c.minSize):null,max=c.maxSize!=null&&c.maxSize!==""?Number(c.maxSize):null,older=c.olderThanDays!=null&&c.olderThanDays!==""?Number(c.olderThanDays):null,newer=c.newerThanDays!=null&&c.newerThanDays!==""?Number(c.newerThanDays):null,type=c.type&&String(c.type).trim()&&c.type!=="all"?String(c.type).trim():null,tiers=normList(c.tiers).map(t=>t.toLowerCase()),blobTypes=normList(c.blobTypes).map(t=>t.toLowerCase()),tagKeys=normList(c.tagKeys),tags=c.tags&&typeof c.tags=="object"?c.tags:null,DAY=864e5;return list.filter(b=>{let nm=String(b.name||""),nml=nm.toLowerCase();if(re&&!re.test(nm)||prefix&&!nml.startsWith(prefix)||suffix&&!nml.endsWith(suffix)||contains&&nml.indexOf(contains)===-1)return!1;let sz=Number(b.size)||0;if(min!=null&&szmax)return!1;if((older!=null||newer!=null)&&b.lastModified){let ageMs=nowMs-Date.parse(b.lastModified);if(older!=null&&!(ageMs>older*DAY)||newer!=null&&!(ageMs<=newer*DAY))return!1}else if(older!=null||newer!=null)return!1;if(type&&typeFamily(b.contentType,b.name)!==type||tiers.length&&tiers.indexOf(String(b.accessTier||"").toLowerCase())===-1||blobTypes.length&&blobTypes.indexOf(String(b.blobType||"").toLowerCase())===-1)return!1;if(tagKeys.length){let bt=b.tags||{};for(let k of tagKeys)if(!(k in bt))return!1}if(tags){let bt=b.tags||{};for(let k of Object.keys(tags))if(String(bt[k])!==String(tags[k]))return!1}return!0})}function normList(v){return v==null||v===""?[]:Array.isArray(v)?v.map(x=>String(x).trim()).filter(Boolean):String(v).split(",").map(x=>x.trim()).filter(Boolean)}function computeBlobStats(blobs){let list=Array.isArray(blobs)?blobs:[],n=list.length,sizes=list.map(b=>Number(b.size)||0),total=sizes.reduce((a,s)=>a+s,0),max=n?Math.max(...sizes):0,avg=n?Math.round(total/n):0,buckets=[{label:"0\u20131 KB",lo:0,hi:1024},{label:"1 KB\u20131 MB",lo:1024,hi:1048576},{label:"1\u2013100 MB",lo:1048576,hi:104857600},{label:"100 MB\u20131 GB",lo:104857600,hi:1073741824},{label:">1 GB",lo:1073741824,hi:1/0}].map(bk=>({label:bk.label,n:sizes.filter(s=>s>=bk.lo&&s({label,n:v.n,bytes:v.bytes})).sort((a,b)=>b.bytes-a.bytes),byTierMap=new Map;for(let b of list){let tier=String(b.accessTier||"").trim()||"\u2014",cur=byTierMap.get(tier)||{n:0,bytes:0};cur.n++,cur.bytes+=Number(b.size)||0,byTierMap.set(tier,cur)}let byTier=[...byTierMap.entries()].map(([label,v])=>({label,n:v.n,bytes:v.bytes})).sort((a,b)=>b.bytes-a.bytes),hasTier=byTier.some(t=>t.label!=="\u2014"),byExtMap=new Map;for(let b of list){let parts=String(b.name||"").toLowerCase().split("."),ext=parts.length>1?"."+parts.pop():"(none)",cur=byExtMap.get(ext)||{n:0,bytes:0};cur.n++,cur.bytes+=Number(b.size)||0,byExtMap.set(ext,cur)}let byExt=[...byExtMap.entries()].map(([label,v])=>({label,n:v.n,bytes:v.bytes})).sort((a,b)=>b.bytes-a.bytes).slice(0,8),topLargest=[...list].sort((a,b)=>(Number(b.size)||0)-(Number(a.size)||0)).slice(0,10).map(b=>({name:b.name,size:Number(b.size)||0,sizeh:fmtBytes(b.size),lastModified:b.lastModified||null}));return{count:n,totalBytes:total,totalh:fmtBytes(total),avgBytes:avg,avgh:fmtBytes(avg),maxBytes:max,maxh:fmtBytes(max),buckets,byType,byTier:hasTier?byTier:[],byExt,topLargest}}function filterAndStat(blobs,criteria={}){let filtered=applyBlobFilter(blobs,criteria);return{filtered,stats:computeBlobStats(filtered),criteria}}var OVERWRITE={overwrite:"true",skip:"false","if-newer":"ifSourceNewer"};function resolutionFlag(resolution){return OVERWRITE[resolution]||"true"}function planTransfer(sourceBlobs,destBlobs,resolution="overwrite"){let src=Array.isArray(sourceBlobs)?sourceBlobs:[],dstByName=new Map((Array.isArray(destBlobs)?destBlobs:[]).map(b=>[b.name,b])),conflicts=[],newFiles=[];for(let b of src)dstByName.has(b.name)?conflicts.push(b):newFiles.push(b);let toTransfer;if(resolution==="skip")toTransfer=newFiles.slice();else if(resolution==="if-newer"){let newerConflicts=conflicts.filter(b=>{let d=dstByName.get(b.name),s=Date.parse(b.lastModified||""),dm=Date.parse(d?.lastModified||"");return Number.isFinite(s)&&Number.isFinite(dm)?s>dm:!0});toTransfer=newFiles.concat(newerConflicts)}else toTransfer=src.slice();let bytes=toTransfer.reduce((a,b)=>a+(Number(b.size)||0),0),skipped=src.length-toTransfer.length;return{resolution,sourceCount:src.length,destCount:dstByName.size,conflictCount:conflicts.length,newCount:newFiles.length,transferCount:toTransfer.length,skippedCount:skipped,transferBytes:bytes,transferBytesh:fmtBytes(bytes),conflicts:conflicts.slice(0,100).map(b=>({name:b.name,size:Number(b.size)||0,sizeh:fmtBytes(b.size),lastModified:b.lastModified||null})),toTransfer:toTransfer.map(b=>b.name)}}function azcopyCommand({sourceUrl,destUrl,resolution="overwrite",includeNames=null,allSource=!1}={}){let q=s=>`"${String(s||"").replace(/[\\"$`]/g,"\\$&")}"`,flags=[`--overwrite=${resolutionFlag(resolution)}`];if(allSource)flags.push("--recursive");else if(Array.isArray(includeNames)){if(!includeNames.length)return{command:null,needsLogin:!1,empty:!0};flags.push(`--include-path ${q(includeNames.join(";"))}`),flags.push("--recursive")}else flags.push("--recursive");let needsLogin=!/[?&]sig=/.test(String(sourceUrl||""))||!/[?&]sig=/.test(String(destUrl||""));return{command:`azcopy copy ${q(sourceUrl)} ${q(destUrl)} ${flags.join(" ")}`,needsLogin}}function sniffText(bytes){let buf=bytes instanceof Uint8Array?bytes:new Uint8Array(bytes||[]);if(!buf.length)return{isText:!0,text:""};let control=0;for(let i=0;i13&&c<32||c===127)&&control++}if(control/buf.length>.1)return{isText:!1,text:null};try{let text=new TextDecoder("utf-8",{fatal:!1}).decode(buf);return(text.match(/\uFFFD/g)||[]).length/Math.max(text.length,1)>.1?{isText:!1,text:null}:{isText:!0,text}}catch{return{isText:!1,text:null}}}var MAGIC=[{off:0,hex:"67 6C 54 46",format:"glTF binary (GLB) 3D model",category:"3D model"},{off:0,hex:"89 50 4E 47 0D 0A 1A 0A",format:"PNG image",category:"image"},{off:0,hex:"FF D8 FF",format:"JPEG image",category:"image"},{off:0,hex:"47 49 46 38",format:"GIF image",category:"image"},{off:0,hex:"42 4D",format:"BMP image",category:"image"},{off:0,hex:"49 49 2A 00",format:"TIFF image (little-endian)",category:"image"},{off:0,hex:"4D 4D 00 2A",format:"TIFF image (big-endian)",category:"image"},{off:0,hex:"00 00 01 00",format:"ICO icon",category:"image"},{off:0,hex:"25 50 44 46",format:"PDF document",category:"document"},{off:0,hex:"D0 CF 11 E0 A1 B1 1A E1",format:"Legacy MS Office (OLE2: .doc/.xls/.ppt)",category:"document"},{off:0,hex:"50 4B 03 04",format:"ZIP archive (or OOXML .docx/.xlsx/.pptx, JAR, APK)",category:"archive"},{off:0,hex:"50 4B 05 06",format:"ZIP archive (empty)",category:"archive"},{off:0,hex:"1F 8B",format:"gzip archive",category:"archive"},{off:0,hex:"42 5A 68",format:"bzip2 archive",category:"archive"},{off:0,hex:"37 7A BC AF 27 1C",format:"7-Zip archive",category:"archive"},{off:0,hex:"52 61 72 21 1A 07",format:"RAR archive",category:"archive"},{off:0,hex:"FD 37 7A 58 5A 00",format:"XZ archive",category:"archive"},{off:257,hex:"75 73 74 61 72",format:"TAR archive",category:"archive"},{off:0,hex:"7F 45 4C 46",format:"ELF executable / shared object",category:"executable"},{off:0,hex:"4D 5A",format:"Windows PE executable (.exe/.dll)",category:"executable"},{off:0,hex:"CA FE BA BE",format:"Java class file",category:"executable"},{off:0,hex:"00 61 73 6D",format:"WebAssembly (WASM) module",category:"executable"},{off:0,hex:"4F 67 67 53",format:"Ogg media",category:"audio"},{off:0,hex:"49 44 33",format:"MP3 audio (ID3)",category:"audio"},{off:0,hex:"66 4C 61 43",format:"FLAC audio",category:"audio"},{off:0,hex:"53 51 4C 69 74 65 20 66 6F 72 6D 61 74 20 33 00",format:"SQLite database",category:"database"},{off:0,hex:"50 41 52 31",format:"Apache Parquet",category:"data"},{off:0,hex:"4F 62 6A 01",format:"Apache Avro",category:"data"}],EXT_FORMAT={glb:["glTF binary (GLB) 3D model","3D model"],gltf:["glTF 3D model","3D model"],obj:["Wavefront OBJ 3D model","3D model"],fbx:["Autodesk FBX 3D model","3D model"],stl:["STL 3D model","3D model"],usdz:["USDZ 3D scene","3D model"],ply:["PLY 3D model","3D model"],png:["PNG image","image"],jpg:["JPEG image","image"],jpeg:["JPEG image","image"],gif:["GIF image","image"],webp:["WebP image","image"],bmp:["BMP image","image"],tiff:["TIFF image","image"],ico:["ICO icon","image"],heic:["HEIC image","image"],avif:["AVIF image","image"],svg:["SVG vector image","image"],psd:["Photoshop document","image"],pdf:["PDF document","document"],docx:["Word document (OOXML)","document"],xlsx:["Excel workbook (OOXML)","document"],pptx:["PowerPoint deck (OOXML)","document"],doc:["Legacy Word document","document"],xls:["Legacy Excel workbook","document"],ppt:["Legacy PowerPoint deck","document"],zip:["ZIP archive","archive"],gz:["gzip archive","archive"],tgz:["gzip TAR archive","archive"],tar:["TAR archive","archive"],rar:["RAR archive","archive"],"7z":["7-Zip archive","archive"],bz2:["bzip2 archive","archive"],xz:["XZ archive","archive"],zst:["Zstandard archive","archive"],mp3:["MP3 audio","audio"],wav:["WAV audio","audio"],flac:["FLAC audio","audio"],ogg:["Ogg audio","audio"],m4a:["AAC audio","audio"],mp4:["MP4 video","video"],mov:["QuickTime video","video"],avi:["AVI video","video"],mkv:["Matroska video","video"],webm:["WebM video","video"],exe:["Windows executable","executable"],dll:["Windows library","executable"],so:["Shared object","executable"],wasm:["WebAssembly module","executable"],parquet:["Apache Parquet","data"],avro:["Apache Avro","data"],orc:["Apache ORC","data"],db:["SQLite database","database"],sqlite:["SQLite database","database"],bin:["Raw binary","binary"],dat:["Raw data","binary"]};function hexHead(buf,n=16){let out=[];for(let i=0;i{let sig=hex.split(" ").map(h=>parseInt(h,16));if(off+sig.length>buf.length)return!1;for(let i=0;ibuf.length)return{version,truncated:!0};json=new TextDecoder("utf-8").decode(buf.subarray(dstart,dend));break}off=dend}if(json==null)return{version,truncated:!0};let g;try{g=JSON.parse(json)}catch{return{version,truncated:!0}}let n=a=>Array.isArray(a)?a.length:0,accessors=g.accessors||[],vertices=0,triangles=0;for(let mesh of g.meshes||[])for(let prim of mesh.primitives||[]){let posIdx=prim.attributes&&prim.attributes.POSITION;posIdx!=null&&accessors[posIdx]&&(vertices+=accessors[posIdx].count||0),prim.indices!=null&&accessors[prim.indices]&&(triangles+=Math.floor((accessors[prim.indices].count||0)/3))}return{version,truncated:!1,meshes:n(g.meshes),materials:n(g.materials),textures:n(g.textures),images:n(g.images),animations:n(g.animations),nodes:n(g.nodes),accessors:n(g.accessors),vertices,triangles,generator:g.asset&&g.asset.generator||null,gltfVersion:g.asset&&g.asset.version||null}}function previewLang(name){let m=/\.([a-z0-9]+)$/i.exec(String(name||"")),ext=m?m[1].toLowerCase():"";return{json:"json",ndjson:"json",js:"javascript",mjs:"javascript",ts:"typescript",csv:"csv",tsv:"csv",xml:"xml",html:"html",htm:"html",md:"markdown",yml:"yaml",yaml:"yaml",log:"log",txt:"text",ini:"ini",conf:"ini",sql:"sql",sh:"shell",py:"python",cs:"csharp"}[ext]||ext||"text"}function parseSasUrl(rawUrl){let u;try{u=new URL(String(rawUrl||"").trim())}catch{return{ok:!1,error:"That doesn't look like a URL."}}if(u.protocol!=="https:"){let emulator=/^(127\.0\.0\.1|localhost|\[::1\])$/i.test(u.hostname);if(!(u.protocol==="http:"&&emulator))return{ok:!1,error:"SAS URL must use HTTPS \u2014 a SAS signature is a bearer credential and must not travel over plain HTTP."}}let q=u.searchParams;if(!q.get("sig"))return{ok:!1,error:"No SAS signature (sig=) in the URL \u2014 that's a plain URL, not a SAS."};let host=u.hostname,accountMatch=/^([^.]+)\.blob\./.exec(host),account=accountMatch?accountMatch[1]:host,segs=u.pathname.replace(/^\/+/,"").split("/"),container=segs[0]||"",blobPath=segs.slice(1).join("/"),perms=q.get("sp")||"",expiry=q.get("se")||"",resource=q.get("sr")||(blobPath?"b":container?"c":""),now=Date.now(),expMs=expiry?Date.parse(expiry):NaN,expired=Number.isFinite(expMs)&&expMs{let done=!1,finish=value=>{done||(done=!0,resolve(value))};execFile2("azcopy",["--version"],{timeout:4e3,windowsHide:!0},(err,stdout)=>{if(err){let missing=err.code==="ENOENT";finish({installed:!1,version:null,reason:missing?"notFound":"error",hint:missing?`AzCopy isn't on your PATH. Install it from ${AZCOPY_INSTALL_URL}, then re-open the transfer plan.`:`AzCopy was found but couldn't be queried (${String(err.message||err).slice(0,120)}).`,installUrl:AZCOPY_INSTALL_URL});return}let version=(String(stdout||"").match(/\d+\.\d+\.\d+/)||[])[0]||null;finish({installed:!0,version,reason:"ok",hint:null,installUrl:AZCOPY_INSTALL_URL})}).on("error",()=>finish({installed:!1,version:null,reason:"notFound",hint:`AzCopy isn't on your PATH. Install it from ${AZCOPY_INSTALL_URL}, then re-open the transfer plan.`,installUrl:AZCOPY_INSTALL_URL}))})),azcopyProbe}import"node:fs";var BUILD_INFO=resolveStudioBuildInfo(new URL("./extension.mjs",import.meta.url));import"node:fs";var TENANT_ICON=`