@nullplatform/mcp 0.1.16 → 0.1.17

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.
@@ -1220,5 +1220,5 @@ Boolean requesting whether a visible border and background is provided by the ho
1220
1220
  - omitted: host decides border`)}),IS=c.object({method:c.literal("ui/request-display-mode"),params:c.object({mode:Wr.describe("The display mode being requested.")})}),x_=c.object({mode:Wr.describe("The display mode that was actually set. May differ from requested if not supported.")}).passthrough(),$_=c.union([c.literal("model"),c.literal("app")]).describe("Tool visibility scope - who can access the tool."),PS=c.object({resourceUri:c.string().optional(),visibility:c.array($_).optional().describe(`Who can access this tool. Default: ["model", "app"]
1221
1221
  - "model": Tool visible to and callable by the agent
1222
1222
  - "app": Tool callable by the app from this server only`),csp:c.never().optional(),permissions:c.never().optional()}),NS=c.object({mimeTypes:c.array(c.string()).optional().describe('Array of supported MIME types for UI resources.\nMust include `"text/html;profile=mcp-app"` for MCP Apps support.')}),TS=c.object({method:c.literal("ui/download-file"),params:c.object({contents:c.array(c.union([gl,hl])).describe("Resource contents to download \u2014 embedded (inline data) or linked (host fetches). Uses standard MCP resource types.")})}),jS=c.object({method:c.literal("ui/message"),params:c.object({role:c.literal("user").describe('Message role, currently only "user" is supported.'),content:c.array(Mt).describe("Message content blocks (text, image, etc.).")})}),RS=c.object({method:c.literal("ui/notifications/sandbox-resource-ready"),params:c.object({html:c.string().describe("HTML content to load into the inner iframe."),sandbox:c.string().optional().describe("Optional override for the inner iframe's sandbox attribute."),csp:Sl.optional().describe("CSP configuration from resource metadata."),permissions:wl.optional().describe("Sandbox permissions from resource metadata.")})}),k_=c.object({method:c.literal("ui/notifications/tool-result"),params:Wt.describe("Standard MCP tool execution result.")}),Wm=c.object({toolInfo:c.object({id:Ut.optional().describe("JSON-RPC id of the tools/call request."),tool:Qo.describe("Tool definition including name, inputSchema, etc.")}).optional().describe("Metadata of the tool call that instantiated this App."),theme:s_.optional().describe("Current color theme preference."),styles:v_.optional().describe("Style configuration for theming the app."),displayMode:Wr.optional().describe("How the UI is currently displayed."),availableDisplayModes:c.array(Wr).optional().describe("Display modes the host supports."),containerDimensions:c.union([c.object({height:c.number().describe("Fixed container height in pixels.")}),c.object({maxHeight:c.union([c.number(),c.undefined()]).optional().describe("Maximum container height in pixels.")})]).and(c.union([c.object({width:c.number().describe("Fixed container width in pixels.")}),c.object({maxWidth:c.union([c.number(),c.undefined()]).optional().describe("Maximum container width in pixels.")})])).optional().describe(`Container dimensions. Represents the dimensions of the iframe or other
1223
- container holding the app. Specify either width or maxWidth, and either height or maxHeight.`),locale:c.string().optional().describe("User's language and region preference in BCP 47 format."),timeZone:c.string().optional().describe("User's timezone in IANA format."),userAgent:c.string().optional().describe("Host application identifier."),platform:c.union([c.literal("web"),c.literal("desktop"),c.literal("mobile")]).optional().describe("Platform type for responsive design decisions."),deviceCapabilities:c.object({touch:c.boolean().optional().describe("Whether the device supports touch input."),hover:c.boolean().optional().describe("Whether the device supports hover interactions.")}).optional().describe("Device input capabilities."),safeAreaInsets:c.object({top:c.number().describe("Top safe area inset in pixels."),right:c.number().describe("Right safe area inset in pixels."),bottom:c.number().describe("Bottom safe area inset in pixels."),left:c.number().describe("Left safe area inset in pixels.")}).optional().describe("Mobile safe area boundaries in pixels.")}).passthrough(),z_=c.object({method:c.literal("ui/notifications/host-context-changed"),params:Wm.describe("Partial context update containing only changed fields.")}),OS=c.object({method:c.literal("ui/update-model-context"),params:c.object({content:c.array(Mt).optional().describe("Context content blocks (text, image, etc.)."),structuredContent:c.record(c.string(),c.unknown().describe("Structured content for machine-readable context data.")).optional().describe("Structured content for machine-readable context data.")})}),AS=c.object({method:c.literal("ui/initialize"),params:c.object({appInfo:Dr.describe("App identification (name and version)."),appCapabilities:y_.describe("Features and capabilities this app provides."),protocolVersion:c.string().describe("Protocol version this app supports.")})}),S_=c.object({protocolVersion:c.string().describe('Negotiated protocol version string (e.g., "2025-11-21").'),hostInfo:Dr.describe("Host application identification and version."),hostCapabilities:b_.describe("Features and capabilities provided by the host."),hostContext:Wm.describe("Rich context about the host environment.")}).passthrough(),w_={target:"draft-2020-12"};async function Lm(e,r){let n=e["~standard"];if(n.jsonSchema)return n.jsonSchema[r](w_);if(n.vendor==="zod"){let{z:i}=await Promise.resolve().then(()=>(jr(),rl));return i.toJSONSchema(e,{io:r})}throw Error(`Schema (vendor: ${n.vendor}) does not implement Standard JSON Schema (~standard.jsonSchema). Use a library that does (zod v4, ArkType, Valibot) or wrap your schema accordingly.`)}async function Mm(e,r,n=""){let i=await e["~standard"].validate(r);if(i.issues){let t=i.issues.map(o=>{let a=o.path?.map(s=>typeof s=="object"?s.key:s).join(".");return a?`${a}: ${o.message}`:o.message}).join("; ");throw Error(n+t)}return i.value}function Fm(e,r=document.documentElement){for(let[n,i]of Object.entries(e))i!==void 0&&r.style.setProperty(n,i)}function qm(e){if(document.getElementById("__mcp-host-fonts"))return;let r=document.createElement("style");r.id="__mcp-host-fonts",r.textContent=e,document.head.appendChild(r)}var ei=class ei extends kl{constructor(n,i={},t={autoResize:!0}){super(t);L(this,"_appInfo");L(this,"_capabilities");L(this,"options");L(this,"_hostCapabilities");L(this,"_hostInfo");L(this,"_hostContext");L(this,"_registeredTools",{});L(this,"_initializedSent",!1);L(this,"eventSchemas",{toolinput:m_,toolinputpartial:f_,toolresult:k_,toolcancelled:g_,hostcontextchanged:z_});L(this,"_everHadListener",new Set);L(this,"_toolHandlersInitialized",!1);L(this,"_onteardown");L(this,"_oncalltool");L(this,"_onlisttools");L(this,"sendOpenLink",this.openLink);this._appInfo=n,this._capabilities=i,this.options=t,t.allowUnsafeEval||c.config({jitless:!0}),this.setRequestHandler(Zt,o=>(console.log("Received ping:",o.params),{})),this.setEventHandler("hostcontextchanged",void 0)}_assertInitialized(n){if(this._initializedSent)return;let i=`[ext-apps] App.${n}() called before connect() completed the ui/initialize handshake. Await app.connect() before calling this method, or move data loading to an ontoolresult handler.`;if(this.options?.strict)throw Error(i);console.warn(`${i}. This will throw in a future release.`)}_assertHandlerTiming(n){if(!ei.ONE_SHOT_EVENTS.has(n)||this._everHadListener.has(n)||(this._everHadListener.add(n),!this._initializedSent))return;let i=`[ext-apps] "${String(n)}" handler registered after connect() completed the ui/initialize handshake. The host may have already sent this notification. Register handlers before calling app.connect().`;if(this.options?.strict)throw Error(i);console.warn(i)}setEventHandler(n,i){i&&this._assertHandlerTiming(n),super.setEventHandler(n,i)}addEventListener(n,i){this._assertHandlerTiming(n),super.addEventListener(n,i)}onEventDispatch(n,i){n==="hostcontextchanged"&&(this._hostContext={...this._hostContext,...i})}registerCapabilities(n){if(this.transport)throw Error("Cannot register capabilities after transport is established");this._capabilities=Um(this._capabilities,n)}registerTool(n,i,t){if(this._registeredTools[n])throw Error(`Tool ${n} is already registered`);let o=this,a=()=>{o._initializedSent&&o._capabilities.tools?.listChanged&&o.sendToolListChanged()},s=i.inputSchema!==void 0,u={title:i.title,description:i.description,inputSchema:i.inputSchema,outputSchema:i.outputSchema,annotations:i.annotations,_meta:i._meta,enabled:!0,enable(){this.enabled=!0,a()},disable(){this.enabled=!1,a()},update(p){Object.assign(this,p),a()},remove(){o._registeredTools[n]===u&&(delete o._registeredTools[n],a())},handler:async(p,f)=>{if(!u.enabled)throw Error(`Tool ${n} is disabled`);let l;if(s){let _=u.inputSchema,g=_?await Mm(_,p??{},`Invalid input for tool ${n}: `):p??{};l=await t(g,f)}else l=await t(f);return u.outputSchema&&!l.isError&&(l.structuredContent=await Mm(u.outputSchema,l.structuredContent,`Invalid output for tool ${n}: `)),l}};return this._registeredTools[n]=u,!this._capabilities.tools&&!this.transport&&this.registerCapabilities({tools:{listChanged:!0}}),this.ensureToolHandlersInitialized(),a(),u}ensureToolHandlersInitialized(){this._toolHandlersInitialized||(this._toolHandlersInitialized=!0,this.oncalltool=async(n,i)=>{let t=this._registeredTools[n.name];if(!t)throw Error(`Tool ${n.name} not found`);return t.handler(n.arguments,i)},this.onlisttools=async(n,i)=>({tools:await Promise.all(Object.entries(this._registeredTools).filter(([t,o])=>o.enabled).map(async([t,o])=>{let a={name:t,title:o.title,description:o.description,inputSchema:o.inputSchema?await Lm(o.inputSchema,"input"):{type:"object",properties:{}}};return o.outputSchema&&(a.outputSchema=await Lm(o.outputSchema,"output")),o.annotations&&(a.annotations=o.annotations),o._meta&&(a._meta=o._meta),a}))}))}async sendToolListChanged(n={}){this._assertInitialized("sendToolListChanged"),await this.notification({method:"notifications/tools/list_changed",params:n})}getHostCapabilities(){return this._hostCapabilities}getHostVersion(){return this._hostInfo}getHostContext(){return this._hostContext}get ontoolinput(){return this.getEventHandler("toolinput")}set ontoolinput(n){this.setEventHandler("toolinput",n)}get ontoolinputpartial(){return this.getEventHandler("toolinputpartial")}set ontoolinputpartial(n){this.setEventHandler("toolinputpartial",n)}get ontoolresult(){return this.getEventHandler("toolresult")}set ontoolresult(n){this.setEventHandler("toolresult",n)}get ontoolcancelled(){return this.getEventHandler("toolcancelled")}set ontoolcancelled(n){this.setEventHandler("toolcancelled",n)}get onhostcontextchanged(){return this.getEventHandler("hostcontextchanged")}set onhostcontextchanged(n){this.setEventHandler("hostcontextchanged",n)}get onteardown(){return this._onteardown}set onteardown(n){this.warnIfRequestHandlerReplaced("onteardown",this._onteardown,n),this._onteardown=n,this.replaceRequestHandler(__,(i,t)=>{if(!this._onteardown)throw Error("No onteardown handler set");return this._onteardown(i.params,t)})}get oncalltool(){return this._oncalltool}set oncalltool(n){this.warnIfRequestHandlerReplaced("oncalltool",this._oncalltool,n),this._oncalltool=n,this.replaceRequestHandler(_l,(i,t)=>{if(!this._oncalltool)throw Error("No oncalltool handler set");return this._oncalltool(i.params,t)})}get onlisttools(){return this._onlisttools}set onlisttools(n){this.warnIfRequestHandlerReplaced("onlisttools",this._onlisttools,n),this._onlisttools=n,this.replaceRequestHandler(vl,(i,t)=>{if(!this._onlisttools)throw Error("No onlisttools handler set");return this._onlisttools(i.params,t)})}assertCapabilityForMethod(n){switch(n){case"sampling/createMessage":if(!this._hostCapabilities?.sampling)throw Error(`Host does not support sampling (required for ${n})`);break}}assertRequestHandlerCapability(n){switch(n){case"tools/call":case"tools/list":if(!this._capabilities.tools)throw Error(`Client does not support tool capability (required for ${n})`);return;case"ping":case"ui/resource-teardown":return;default:throw Error(`No handler for method ${n} registered`)}}assertNotificationCapability(n){}assertTaskCapability(n){throw Error("Tasks are not supported in MCP Apps")}assertTaskHandlerCapability(n){throw Error("Task handlers are not supported in MCP Apps")}async callServerTool(n,i){if(this._assertInitialized("callServerTool"),typeof n=="string")throw Error(`callServerTool() expects an object as its first argument, but received a string ("${n}"). Did you mean: callServerTool({ name: "${n}", arguments: { ... } })?`);return await this.request({method:"tools/call",params:n},Wt,{onprogress:()=>{},resetTimeoutOnProgress:!0,...i})}async readServerResource(n,i){return this._assertInitialized("readServerResource"),await this.request({method:"resources/read",params:n},pl,i)}async listServerResources(n,i){return this._assertInitialized("listServerResources"),await this.request({method:"resources/list",params:n},ll,i)}async createSamplingMessage(n,i){this._assertInitialized("createSamplingMessage");let t=n.tools?yl:bl;return await this.request({method:"sampling/createMessage",params:n},t,i)}sendMessage(n,i){return this._assertInitialized("sendMessage"),this.request({method:"ui/message",params:n},d_,i)}sendLog(n){return this.notification({method:"notifications/message",params:n})}updateModelContext(n,i){return this._assertInitialized("updateModelContext"),this.request({method:"ui/update-model-context",params:n},Mo,i)}openLink(n,i){return this._assertInitialized("openLink"),this.request({method:"ui/open-link",params:n},u_,i)}downloadFile(n,i){return this._assertInitialized("downloadFile"),this.request({method:"ui/download-file",params:n},p_,i)}requestTeardown(n={}){return this.notification({method:"ui/notifications/request-teardown",params:n})}requestDisplayMode(n,i){return this._assertInitialized("requestDisplayMode"),this.request({method:"ui/request-display-mode",params:n},x_,i)}sendSizeChanged(n){return this.notification({method:"ui/notifications/size-changed",params:n})}setupSizeChangedNotifications(){let n=!1,i=0,t=0,o=()=>{n||(n=!0,requestAnimationFrame(()=>{n=!1;let s=document.documentElement,u=s.style.height;s.style.height="max-content";let p=Math.ceil(s.getBoundingClientRect().height);s.style.height=u;let f=Math.ceil(window.innerWidth);(f!==i||p!==t)&&(i=f,t=p,this.sendSizeChanged({width:f,height:p}))}))};o();let a=new ResizeObserver(o);return a.observe(document.documentElement),a.observe(document.body),()=>a.disconnect()}async connect(n=new zl(window.parent,window.parent),i){if(this.transport)throw Error("App is already connected. Call close() before connecting again.");this._initializedSent=!1,await super.connect(n);try{let t=await this.request({method:"ui/initialize",params:{appCapabilities:this._capabilities,appInfo:this._appInfo,protocolVersion:i_}},S_,i);if(t===void 0)throw Error(`Server sent invalid initialize result: ${t}`);this._hostCapabilities=t.hostCapabilities,this._hostInfo=t.hostInfo,this._hostContext=t.hostContext,await this.notification({method:"ui/notifications/initialized"}),this._initializedSent=!0,this.options?.autoResize&&this.setupSizeChangedNotifications()}catch(t){throw this.close(),t}}};L(ei,"ONE_SHOT_EVENTS",new Set(["toolinput","toolinputpartial","toolresult","toolcancelled"]));var Xo=ei;var I_="nullplatform/data";function Hm(e){let r=e._meta?.[I_];return r&&typeof r=="object"?{...e,structuredContent:{...e.structuredContent??{},...r}}:e}function P_(e){if(!e)return;let r=e.trim().toLowerCase(),n,i,t,o=/^#([0-9a-f]{3}|[0-9a-f]{6})$/.exec(r)?.[1];if(o){let a=o.length===3?o.split("").map(s=>s+s).join(""):o;n=parseInt(a.slice(0,2),16),i=parseInt(a.slice(2,4),16),t=parseInt(a.slice(4,6),16)}else{let a=/^rgba?\(\s*([\d.]+)[ ,]+([\d.]+)[ ,]+([\d.]+)/.exec(r);a&&([n,i,t]=[Number(a[1]),Number(a[2]),Number(a[3])]);let s=/^hsla?\(\s*[\d.]+[ ,]+[\d.]+%?[ ,]+([\d.]+)%/.exec(r);if(s)return Number(s[1])/100}if(!(n===void 0||i===void 0||t===void 0))return(.2126*n+.7152*i+.0722*t)/255}function N_(e){if(e.theme==="dark"||e.theme==="light")return e.theme;let r=e.styles?.variables;if(!r)return;let n=P_(r["--color-background-primary"]??r["--color-background-secondary"]);if(n!==void 0)return n<.5?"dark":"light"}function Vm(e){if(!e)return;let r=document.documentElement,n=e.styles?.variables,i=N_(e);i&&(r.classList.toggle("dark",i==="dark"),r.classList.toggle("light",i==="light"),r.style.colorScheme=i);try{n&&Fm(n),e.styles?.css?.fonts&&qm(e.styles.css.fonts)}catch{}console.debug("[np-widget] theme:",e.theme,"->",i??"os-fallback","| tokens:",!!n,"| fonts:",!!e.styles?.css?.fonts)}function Bm(e){let[r,n]=Ae(null),[i,t]=Ae(!1),o=De(null);Pe(()=>{let p=new Xo({name:e,version:"0.3.0"},{},{autoResize:!0});o.current=p,p.ontoolresult=f=>n(Hm(f)),p.onhostcontextchanged=f=>Vm(f),p.connect().then(()=>{Vm(p.getHostContext()),t(!0)}).catch(()=>t(!1))},[e]);let a=Ce(async(p,f)=>{if(!o.current)throw new Error("not connected");return Hm(await o.current.callServerTool({name:p,arguments:f}))},[]),s=Ce(p=>{o.current?.sendMessage({role:"user",content:[{type:"text",text:p}]}).catch(()=>{})},[]),u=Ce(p=>{try{o.current?.updateModelContext({content:[{type:"text",text:p}]}).catch(()=>{})}catch{}},[]);return{result:r,call:a,send:s,brief:u,connected:i}}var T_={"confirm.yes":"Yes, do it","confirm.no":"Cancel","chooser.pick":"pick a scope:","term.empty":"no output yet\u2026","term.loading":"fetching logs\u2026","term.copyLine":"copy line",hint:"Next:",loadMore:"Load more","panel.scopes":"Scopes","panel.releases":"Releases","panel.latestBuild":"Latest build","panel.noScopes":"No scopes yet \u2014 create one to have somewhere to deploy.","panel.scopePlaceholder":"scope name, e.g. dev","panel.typePlaceholder":"type\u2026","panel.pickScope":"Pick a scope","panel.createScope":"Create scope","panel.ship":"ship","panel.live":"live","panel.openRollout":"Open rollout","panel.nothingDeployed":"nothing deployed","panel.noReleases":"none yet","panel.noBuild":"none \u2014 push a commit so CI builds","panel.deployLatest":"Deploy latest","panel.logs":"Logs","panel.metrics":"Metrics","panel.pickType":"Pick a scope type and create again.","panel.waitingData":"waiting for data\u2026","panel.backToList":"apps","rollout.deployingTo":"Deploying to {scope}","rollout.release":"release","rollout.backToApp":"app","rollout.trafficLabel":"Traffic on new version","rollout.live":"{pct}% live","rollout.movingTo":"moving to {pct}%","rollout.move":"Move traffic","rollout.finalize":"Finalize","rollout.rollback":"Rollback","rollout.confirmFinalize":"Finalize and retire the old version?","rollout.confirmRollback":"Return ALL traffic to the previous version?","rollout.log":"Deployment log","rollout.waiting":"waiting for activity\u2026","rollout.failed":"Failed: {message}","rollout.deployment":"Deployment #{id}","rollout.busyMove":"Moving traffic\u2026","rollout.busyFinalize":"Finalizing\u2026","rollout.busyRollback":"Rolling back\u2026","rollout.autoDone":"Done \u2014 the release is fully live.","rollout.autoRolledBack":"Rolled back \u2014 previous version is serving traffic.","rollout.autoFailed":"Deployment failed \u2014 previous version keeps serving.","rollout.autoWaiting":"Waiting for instances \u2014 controls unlock when the rollout is running.","rollout.autoFull":"All traffic on the new version \u2014 finalize to retire the old one.","rollout.autoLabel":"Auto-advance","rollout.autoOff":"off","rollout.trafficHelp":"Drag to move traffic now; auto-advance ramps it to 100%.","rollout.appLogs":"Application logs","rollout.appLogsEmpty":"no application logs yet\u2026","logs.title":"{app} \xB7 logs","logs.heading":"Logs","logs.filter":"filter\u2026","logs.live":"live","logs.refresh":"Refresh","logs.updated":"updated {time}","logs.stale":"no recent activity \xB7 last log {ago}","logs.wrap":"Wrap","logs.settings":"Settings","logs.timezone":"Timezone","logs.tzLocal":"Local","logs.tzUtc":"UTC","logs.copyAll":"Copy all","logs.copied":"Copied","logs.rangeLive":"Live","logs.range1m":"Last 1m","logs.range15m":"Last 15m","logs.range1h":"Last 1h","logs.range6h":"Last 6h","logs.range24h":"Last 24h","logs.rangeCustom":"Custom\u2026","logs.apply":"Apply","logs.from":"From","logs.to":"To","logs.empty":"no log lines yet\u2026","logs.noMatch":"nothing matches the filter","logs.count":"{count} line(s){scope}","logs.scopeSuffix":" \xB7 scope {scope}","logs.refreshFailed":"refresh failed: {message}","metrics.title":"{app} \xB7 {scope} metrics","metrics.heading":"Metrics","metrics.live":"live","metrics.loading":"loading {window}\u2026","metrics.refreshFailed":"refresh failed: {message}","metrics.noData":"no datapoints in this window","metrics.avgMax":"avg {avg} \xB7 max {max}","params.title":"{app} \xB7 parameters","params.heading":"Parameters","params.value":"Value","params.secret":"Secret","params.add":"Add","params.addValue":"Add value","params.editValue":"Edit value","params.parameter":"Parameter","params.allScopes":"All scopes","params.effectiveFor":"Effective values for {scope}","params.ctxApplication":"Application","params.noValues":"No configured values","params.empty":"No parameters yet \u2014 add one to configure this app.","params.readOnly":"read only","params.unset":"unset","params.appliesTo":"Applies to","params.targetApp":"Application","params.targetAppHint":"every scope","params.targetDimension":"By dimension","params.targetScope":"Scope","params.targetScopeHint":"one scope only","params.pickScope":"Pick a scope","params.anyDim":"Any {dim}","params.secretNewOnly":"new parameter only","params.secretPlaceholder":"Enter a new secret value","params.overrides":"Overrides the existing {ctx} value","params.overwriteConfirm":"Overwrite?","params.cancel":"Cancel","params.saveValue":"Save value","params.savingValue":"Saving\u2026","params.applyNote":"Changed values apply on the next deploy.","params.unavailable":"Existing values can't be listed here \u2014 new ones can still be added below.","params.resolveFailed":"Couldn't resolve values: {message}","params.back":"Back","params.deleteParam":"Delete parameter","params.deleteConfirm":"Delete?","params.deleting":"Deleting\u2026","params.deleteReadonly":"Injected by a service link \u2014 delete the link to remove it.","params.notRestored":"This panel's data wasn't restored.","params.refresh":"Refresh","params.refreshing":"Refreshing\u2026","createApp.title":"Create application","createApp.name":"Name","createApp.namespace":"Namespace","createApp.repository":"Repository","createApp.newRepo":"New repository","createApp.importRepo":"Import existing","createApp.template":"Template","createApp.noTemplates":"No templates available","createApp.repoUrl":"Repository URL","createApp.editName":"Customize the repository name","createApp.lockName":"Reset to the generated name","createApp.importUrl":"Existing repository URL","createApp.monorepo":"This repository is a monorepo","createApp.appPath":"Application path inside the repository","createApp.submit":"Create application","createApp.needName":"Name is required.","createApp.needNamespace":"Pick a namespace.","createApp.needTemplate":"Pick a template for the new repository.","createApp.needImportUrl":"Enter the repository URL to import.","createApp.noBaseUrl":"This account has no git provider configured \u2014 use \u201CImport existing\u201D.","createApp.selectNamespaceFirst":"Pick a namespace to generate the repository URL.","createApp.failed":"Failed: {message}","createApp.creatingTitle":"Creating {name}\u2026","createApp.readyTitle":"{name} is ready","createApp.failedTitle":"Couldn't create {name}","createApp.provisioning":"Provisioning\u2026","createApp.readyHint":"Push a commit to trigger the first build, then deploy.","createApp.readyHintNew":"Clone the new repo into a folder, add your code, then push to build and deploy.","createApp.failedHint":"Creation failed \u2014 open the dashboard to see what went wrong.","createApp.openDashboard":"Open in dashboard","findApps.count":"{count} application(s)","findApps.filter":"filter\u2026","findApps.across":"across {ns} namespace(s)","findApps.noMatch":"Nothing matches the filter.","findApps.loadMore":"Load {more} more","findApps.hint":"Click an application to open its panel.","buildsW.title":"{app} \xB7 {count} build(s)","buildsW.none":"No builds yet \u2014 push a commit so CI produces one.","buildsW.buildTitle":"Build #{id}","buildsW.back":"Builds","buildsW.loadingAssets":"Loading assets\u2026","buildsW.noAssets":"No assets for this build.","buildsW.noAssetsRunning":"No assets yet \u2014 the build is still running.","buildsW.noAssetsFailed":"No assets \u2014 the build failed before producing any.","buildsW.assets":"Assets","buildsW.newRelease":"New release","buildsW.creatingRelease":"Creating release\u2026","buildsW.releaseDone":"Release {semver} created.","buildsW.releasedAs":"Released as {semver}","releasesW.title":"{app} \xB7 {count} release(s)","releasesW.none":"No releases yet.","releasesW.deploy":"Deploy","deploymentsW.title":"{app} \xB7 {count} deployment(s)","deploymentsW.none":"No deployments yet.","deploymentsW.group":"{count} scopes","approvalsW.title":"{app} \xB7 {count} approval(s)","approvalsW.none":"No pending approvals.","approvalsW.approve":"Approve","approvalsW.approving":"Approving\u2026","approvalsW.cancel":"Cancel","approvalsW.cancelling":"Cancelling\u2026","approvalsW.confirmCancel":"Cancel this approval request?","approvalsW.by":"by {who}","overviewW.title":"Org health \xB7 {count} app(s) scanned","overviewW.truncated":"showing the first apps \u2014 narrow with a query for the rest","overviewW.active":"Mid-rollout ({count})","overviewW.noActive":"Nothing deploying right now.","overviewW.trouble":"Needs attention ({count})","overviewW.noTrouble":"No failed or rolled-back scopes.","servicesW.title":"{app} \xB7 {count} dependency(ies)","servicesW.none":"No dependencies attached.","servicesW.catalog":"Available to provision","servicesW.dashboard":"Open in dashboard","servicesW.provisionHint":"Provisioning a dependency is a guided flow \u2014 open the dashboard to add one.","serviceCreateW.pick":"Provision a dependency for {app}","serviceCreateW.name":"Name","serviceCreateW.namePlaceholder":"service name","serviceCreateW.params":"Configuration","serviceCreateW.linkParams":"Link configuration","serviceCreateW.linkTo":"Link to","serviceCreateW.wholeApp":"the whole app (all scopes)","serviceCreateW.costNote":"Provisioning creates real cloud resources (cost-bearing).","serviceCreateW.provision":"Provision","serviceCreateW.provisioning":"Provisioning\u2026","serviceCreateW.creating":"Provisioning {name}\u2026","serviceCreateW.ready":"{name} is ready","serviceCreateW.failed":"Couldn't provision {name}","serviceCreateW.stepRequested":"Service requested","serviceCreateW.stepResources":"Provisioning cloud resources","serviceCreateW.stepLinked":"Linked \u2014 connection parameters on the next deploy","serviceCreateW.paramsNote":"Its connection parameters appear after the next deploy.","serviceCreateW.linkNote":"Once it's active, link it to a scope to wire its connection parameters.","serviceCreateW.dashboard":"Open in dashboard","serviceCreateW.failedHint":"Open the dashboard to see what went wrong.","serviceLinkW.pick":"Link a service to {app}","serviceLinkW.service":"Service","serviceLinkW.note":"A credential link (e.g. a database user) provisions resources.","serviceLinkW.link":"Link","serviceLinkW.linking":"Linking\u2026","serviceLinkW.creating":"Linking {service}\u2026","serviceLinkW.ready":"{service} is linked","serviceLinkW.failed":"Couldn't link {service}","serviceLinkW.stepRequested":"Link requested","serviceLinkW.stepProvisioning":"Wiring the connection","serviceLinkW.paramsNote":"Its connection parameters reach the runtime on the next deploy.","serviceActionW.pickTarget":"Run an action in {app}","serviceActionW.pickAction":"Which action on {name}?","serviceActionW.params":"Parameters","serviceActionW.note":"A custom action runs an operation the platform team defined.","serviceActionW.run":"Run","serviceActionW.running":"Running\u2026","serviceActionW.runningTitle":"Running {action}\u2026","serviceActionW.ran":"{action} ran","serviceActionW.failed":"{action} failed","serviceActionW.stepRequested":"Action requested","serviceActionW.stepRunning":"Running","serviceActionW.runningNote":"The action runs asynchronously; its result appears when it finishes.","serviceActionW.failedHint":"Open the dashboard to see what went wrong.","serviceDeleteW.pickTarget":"Delete in {app}","serviceDeleteW.warning":"This destroys the resource and its data. It can't be undone.","serviceDeleteW.delete":"Delete","serviceDeleteW.deleting":"Deleting\u2026","serviceDeleteW.confirm":"Delete it?","serviceDeleteW.stepRequested":"Delete requested","serviceDeleteW.stepRemoving":"Removing","serviceDeleteW.removed":"{name} was deleted","serviceDeleteW.deprovisioning":"Deleting {name}\u2026","serviceDeleteW.removedNote":"The record and its resources are gone.","serviceDeleteW.deprovisioningNote":"An agent is deprovisioning its resources; the record goes once it finishes."},j_={"confirm.yes":"S\xED, hacelo","confirm.no":"Cancelar","chooser.pick":"eleg\xED un scope:","term.empty":"sin salida todav\xEDa\u2026","term.loading":"buscando logs\u2026","term.copyLine":"copiar l\xEDnea",hint:"Siguiente:",loadMore:"Cargar m\xE1s","panel.scopes":"Scopes","panel.releases":"Releases","panel.latestBuild":"\xDAltimo build","panel.noScopes":"Sin scopes todav\xEDa \u2014 cre\xE1 uno para tener d\xF3nde deployar.","panel.scopePlaceholder":"nombre del scope, p. ej. dev","panel.typePlaceholder":"tipo\u2026","panel.pickScope":"Eleg\xED un scope","panel.createScope":"Crear scope","panel.ship":"publicar","panel.live":"en vivo","panel.openRollout":"Abrir rollout","panel.nothingDeployed":"nada deployado","panel.noReleases":"ninguna todav\xEDa","panel.noBuild":"ninguno \u2014 pushe\xE1 un commit para que CI compile","panel.deployLatest":"Deployar lo \xFAltimo","panel.logs":"Logs","panel.metrics":"M\xE9tricas","panel.pickType":"Eleg\xED un tipo de scope y cre\xE1 de nuevo.","panel.waitingData":"esperando datos\u2026","panel.backToList":"apps","rollout.deployingTo":"Deployando a {scope}","rollout.release":"release","rollout.backToApp":"app","rollout.trafficLabel":"Tr\xE1fico en la versi\xF3n nueva","rollout.live":"{pct}% en vivo","rollout.movingTo":"yendo a {pct}%","rollout.move":"Mover tr\xE1fico","rollout.finalize":"Finalizar","rollout.rollback":"Revertir","rollout.confirmFinalize":"\xBFFinalizar y retirar la versi\xF3n anterior?","rollout.confirmRollback":"\xBFDevolver TODO el tr\xE1fico a la versi\xF3n anterior?","rollout.log":"Log del deployment","rollout.waiting":"esperando actividad\u2026","rollout.failed":"Fall\xF3: {message}","rollout.deployment":"Deployment #{id}","rollout.busyMove":"Moviendo tr\xE1fico\u2026","rollout.busyFinalize":"Finalizando\u2026","rollout.busyRollback":"Revirtiendo\u2026","rollout.autoDone":"Listo \u2014 la release est\xE1 completamente en vivo.","rollout.autoRolledBack":"Revertido \u2014 la versi\xF3n anterior est\xE1 sirviendo tr\xE1fico.","rollout.autoFailed":"El deployment fall\xF3 \u2014 la versi\xF3n anterior sigue sirviendo.","rollout.autoWaiting":"Esperando instancias \u2014 los controles se habilitan cuando el rollout est\xE1 corriendo.","rollout.autoFull":"Todo el tr\xE1fico en la versi\xF3n nueva \u2014 finaliz\xE1 para retirar la anterior.","rollout.autoLabel":"Auto-avance","rollout.autoOff":"off","rollout.trafficHelp":"Arrastr\xE1 para mover el tr\xE1fico ahora; el auto-avance sube hasta 100%.","rollout.appLogs":"Logs de la aplicaci\xF3n","rollout.appLogsEmpty":"sin logs de la aplicaci\xF3n todav\xEDa\u2026","logs.title":"{app} \xB7 logs","logs.heading":"Logs","logs.filter":"filtrar\u2026","logs.live":"vivo","logs.refresh":"Refrescar","logs.updated":"actualizado {time}","logs.stale":"sin actividad reciente \xB7 \xFAltimo log {ago}","logs.wrap":"Ajustar","logs.settings":"Ajustes","logs.timezone":"Zona horaria","logs.tzLocal":"Local","logs.tzUtc":"UTC","logs.copyAll":"Copiar todo","logs.copied":"Copiado","logs.rangeLive":"En vivo","logs.range1m":"\xDAltimos 1m","logs.range15m":"\xDAltimos 15m","logs.range1h":"\xDAltima 1h","logs.range6h":"\xDAltimas 6h","logs.range24h":"\xDAltimas 24h","logs.rangeCustom":"Personalizado\u2026","logs.apply":"Aplicar","logs.from":"Desde","logs.to":"Hasta","logs.empty":"sin l\xEDneas de log todav\xEDa\u2026","logs.noMatch":"nada coincide con el filtro","logs.count":"{count} l\xEDnea(s){scope}","logs.scopeSuffix":" \xB7 scope {scope}","logs.refreshFailed":"fall\xF3 el refresh: {message}","metrics.title":"{app} \xB7 m\xE9tricas de {scope}","metrics.heading":"M\xE9tricas","metrics.live":"vivo","metrics.loading":"cargando {window}\u2026","metrics.refreshFailed":"fall\xF3 el refresh: {message}","metrics.noData":"sin datapoints en esta ventana","metrics.avgMax":"prom {avg} \xB7 m\xE1x {max}","params.title":"{app} \xB7 par\xE1metros","params.heading":"Par\xE1metros","params.value":"Valor","params.secret":"Secreto","params.add":"Agregar","params.addValue":"Agregar valor","params.editValue":"Editar valor","params.parameter":"Par\xE1metro","params.allScopes":"Todos los scopes","params.effectiveFor":"Valores efectivos para {scope}","params.ctxApplication":"Aplicaci\xF3n","params.noValues":"Sin valores configurados","params.empty":"Todav\xEDa no hay par\xE1metros \u2014 agreg\xE1 uno para configurar esta app.","params.readOnly":"solo lectura","params.unset":"sin valor","params.appliesTo":"Aplica a","params.targetApp":"Aplicaci\xF3n","params.targetAppHint":"todos los scopes","params.targetDimension":"Por dimensi\xF3n","params.targetScope":"Scope","params.targetScopeHint":"un solo scope","params.pickScope":"Eleg\xED un scope","params.anyDim":"Cualquier {dim}","params.secretNewOnly":"solo par\xE1metro nuevo","params.secretPlaceholder":"Ingres\xE1 un nuevo valor secreto","params.overrides":"Sobrescribe el valor existente de {ctx}","params.overwriteConfirm":"\xBFSobrescribir?","params.cancel":"Cancelar","params.saveValue":"Guardar valor","params.savingValue":"Guardando\u2026","params.applyNote":"Los valores cambiados aplican en el pr\xF3ximo deploy.","params.unavailable":"Los valores existentes no se pueden listar ac\xE1 \u2014 igual pod\xE9s agregar nuevos abajo.","params.resolveFailed":"No pude resolver los valores: {message}","params.back":"Volver","params.deleteParam":"Eliminar par\xE1metro","params.deleteConfirm":"\xBFEliminar?","params.deleting":"Eliminando\u2026","params.deleteReadonly":"Inyectado por un link de servicio \u2014 elimin\xE1 el link para quitarlo.","params.notRestored":"Los datos de este panel no se restauraron.","params.refresh":"Actualizar","params.refreshing":"Actualizando\u2026","createApp.title":"Crear aplicaci\xF3n","createApp.name":"Nombre","createApp.namespace":"Namespace","createApp.repository":"Repositorio","createApp.newRepo":"Nuevo repositorio","createApp.importRepo":"Importar existente","createApp.template":"Template","createApp.noTemplates":"Sin templates disponibles","createApp.repoUrl":"URL del repositorio","createApp.editName":"Personalizar el nombre del repositorio","createApp.lockName":"Volver al nombre generado","createApp.importUrl":"URL del repositorio existente","createApp.monorepo":"Este repositorio es un monorepo","createApp.appPath":"Ruta de la aplicaci\xF3n dentro del repositorio","createApp.submit":"Crear aplicaci\xF3n","createApp.needName":"El nombre es obligatorio.","createApp.needNamespace":"Eleg\xED un namespace.","createApp.needTemplate":"Eleg\xED un template para el nuevo repositorio.","createApp.needImportUrl":"Ingres\xE1 la URL del repositorio a importar.","createApp.noBaseUrl":"Esta cuenta no tiene proveedor de git configurado \u2014 us\xE1 \u201CImportar existente\u201D.","createApp.selectNamespaceFirst":"Eleg\xED un namespace para generar la URL del repositorio.","createApp.failed":"Fall\xF3: {message}","createApp.creatingTitle":"Creando {name}\u2026","createApp.readyTitle":"{name} est\xE1 lista","createApp.failedTitle":"No se pudo crear {name}","createApp.provisioning":"Aprovisionando\u2026","createApp.readyHint":"Pushe\xE1 un commit para disparar el primer build y despu\xE9s deploy\xE1.","createApp.readyHintNew":"Clon\xE1 el repo nuevo en una carpeta, agreg\xE1 tu c\xF3digo y pushe\xE1 para buildear y deployar.","createApp.failedHint":"La creaci\xF3n fall\xF3 \u2014 abr\xED el dashboard para ver qu\xE9 pas\xF3.","createApp.openDashboard":"Abrir en el dashboard","findApps.count":"{count} aplicaci\xF3n(es)","findApps.filter":"filtrar\u2026","findApps.across":"en {ns} namespace(s)","findApps.noMatch":"Nada coincide con el filtro.","findApps.loadMore":"Cargar {more} m\xE1s","findApps.hint":"Hac\xE9 clic en una aplicaci\xF3n para abrir su panel.","buildsW.title":"{app} \xB7 {count} build(s)","buildsW.none":"Todav\xEDa no hay builds \u2014 pushe\xE1 un commit para que CI genere uno.","buildsW.buildTitle":"Build #{id}","buildsW.back":"Builds","buildsW.loadingAssets":"Cargando assets\u2026","buildsW.noAssets":"Sin assets para este build.","buildsW.noAssetsRunning":"Todav\xEDa sin assets \u2014 el build sigue corriendo.","buildsW.noAssetsFailed":"Sin assets \u2014 el build fall\xF3 antes de producir alguno.","buildsW.assets":"Assets","buildsW.newRelease":"Nuevo release","buildsW.creatingRelease":"Creando release\u2026","buildsW.releaseDone":"Release {semver} creado.","buildsW.releasedAs":"Publicado como {semver}","releasesW.title":"{app} \xB7 {count} release(s)","releasesW.none":"Todav\xEDa no hay releases.","releasesW.deploy":"Deployar","deploymentsW.title":"{app} \xB7 {count} deployment(s)","deploymentsW.none":"Todav\xEDa no hay deployments.","deploymentsW.group":"{count} scopes","approvalsW.title":"{app} \xB7 {count} aprobaci\xF3n(es)","approvalsW.none":"No hay aprobaciones pendientes.","approvalsW.approve":"Aprobar","approvalsW.approving":"Aprobando\u2026","approvalsW.cancel":"Cancelar","approvalsW.cancelling":"Cancelando\u2026","approvalsW.confirmCancel":"\xBFCancelar esta solicitud de aprobaci\xF3n?","approvalsW.by":"por {who}","overviewW.title":"Salud del org \xB7 {count} app(s) escaneadas","overviewW.truncated":"mostrando las primeras apps \u2014 filtr\xE1 con una b\xFAsqueda para el resto","overviewW.active":"En despliegue ({count})","overviewW.noActive":"Nada despleg\xE1ndose ahora.","overviewW.trouble":"Requiere atenci\xF3n ({count})","overviewW.noTrouble":"Ning\xFAn scope fall\xF3 ni se revirti\xF3.","servicesW.title":"{app} \xB7 {count} dependencia(s)","servicesW.none":"No hay dependencias adjuntas.","servicesW.catalog":"Disponibles para aprovisionar","servicesW.dashboard":"Abrir en el dashboard","servicesW.provisionHint":"Aprovisionar una dependencia es un flujo guiado \u2014 abr\xED el dashboard para agregar una.","serviceCreateW.pick":"Provisionar una dependencia para {app}","serviceCreateW.name":"Nombre","serviceCreateW.namePlaceholder":"nombre del servicio","serviceCreateW.params":"Configuraci\xF3n","serviceCreateW.linkParams":"Configuraci\xF3n del link","serviceCreateW.linkTo":"Linkear a","serviceCreateW.wholeApp":"toda la app (todos los scopes)","serviceCreateW.costNote":"Provisionar crea recursos cloud reales (tiene costo).","serviceCreateW.provision":"Provisionar","serviceCreateW.provisioning":"Provisionando\u2026","serviceCreateW.creating":"Provisionando {name}\u2026","serviceCreateW.ready":"{name} est\xE1 listo","serviceCreateW.failed":"No se pudo provisionar {name}","serviceCreateW.stepRequested":"Servicio solicitado","serviceCreateW.stepResources":"Provisionando recursos cloud","serviceCreateW.stepLinked":"Linkeado \u2014 par\xE1metros de conexi\xF3n en el pr\xF3ximo deploy","serviceCreateW.paramsNote":"Sus par\xE1metros de conexi\xF3n aparecen despu\xE9s del pr\xF3ximo deploy.","serviceCreateW.linkNote":"Una vez activo, linkealo a un scope para conectar sus par\xE1metros.","serviceCreateW.dashboard":"Abrir en el dashboard","serviceCreateW.failedHint":"Abr\xED el dashboard para ver qu\xE9 pas\xF3.","serviceLinkW.pick":"Linkear un servicio a {app}","serviceLinkW.service":"Servicio","serviceLinkW.note":"Un link de credenciales (p. ej. un usuario de base de datos) provisiona recursos.","serviceLinkW.link":"Linkear","serviceLinkW.linking":"Linkeando\u2026","serviceLinkW.creating":"Linkeando {service}\u2026","serviceLinkW.ready":"{service} est\xE1 linkeado","serviceLinkW.failed":"No se pudo linkear {service}","serviceLinkW.stepRequested":"Link solicitado","serviceLinkW.stepProvisioning":"Conectando","serviceLinkW.paramsNote":"Sus par\xE1metros de conexi\xF3n llegan al runtime en el pr\xF3ximo deploy.","serviceActionW.pickTarget":"Correr una acci\xF3n en {app}","serviceActionW.pickAction":"\xBFQu\xE9 acci\xF3n en {name}?","serviceActionW.params":"Par\xE1metros","serviceActionW.note":"Una custom action corre una operaci\xF3n definida por el equipo de plataforma.","serviceActionW.run":"Correr","serviceActionW.running":"Corriendo\u2026","serviceActionW.runningTitle":"Corriendo {action}\u2026","serviceActionW.ran":"{action} corri\xF3","serviceActionW.failed":"{action} fall\xF3","serviceActionW.stepRequested":"Acci\xF3n solicitada","serviceActionW.stepRunning":"Corriendo","serviceActionW.runningNote":"La acci\xF3n corre de forma as\xEDncrona; su resultado aparece cuando termina.","serviceActionW.failedHint":"Abr\xED el dashboard para ver qu\xE9 pas\xF3.","serviceDeleteW.pickTarget":"Borrar en {app}","serviceDeleteW.warning":"Esto destruye el recurso y sus datos. No se puede deshacer.","serviceDeleteW.delete":"Borrar","serviceDeleteW.deleting":"Borrando\u2026","serviceDeleteW.confirm":"\xBFBorrarlo?","serviceDeleteW.stepRequested":"Borrado solicitado","serviceDeleteW.stepRemoving":"Eliminando","serviceDeleteW.removed":"{name} fue borrado","serviceDeleteW.deprovisioning":"Borrando {name}\u2026","serviceDeleteW.removedNote":"El registro y sus recursos ya no est\xE1n.","serviceDeleteW.deprovisioningNote":"Un agente est\xE1 desaprovisionando sus recursos; el registro se va cuando termina."},R_={"confirm.yes":"Sim, fa\xE7a","confirm.no":"Cancelar","chooser.pick":"escolha um scope:","term.empty":"sem sa\xEDda ainda\u2026","term.loading":"buscando logs\u2026","term.copyLine":"copiar linha",hint:"Pr\xF3ximo:",loadMore:"Carregar mais","panel.scopes":"Scopes","panel.releases":"Releases","panel.latestBuild":"\xDAltimo build","panel.noScopes":"Ainda sem scopes \u2014 crie um para ter onde fazer deploy.","panel.scopePlaceholder":"nome do scope, ex. dev","panel.typePlaceholder":"tipo\u2026","panel.pickScope":"Escolha um scope","panel.createScope":"Criar scope","panel.ship":"publicar","panel.live":"no ar","panel.openRollout":"Abrir rollout","panel.nothingDeployed":"nada em deploy","panel.noReleases":"nenhuma ainda","panel.noBuild":"nenhum \u2014 fa\xE7a push de um commit para o CI buildar","panel.deployLatest":"Deploy do \xFAltimo","panel.logs":"Logs","panel.metrics":"M\xE9tricas","panel.pickType":"Escolha um tipo de scope e crie de novo.","panel.waitingData":"aguardando dados\u2026","panel.backToList":"apps","rollout.deployingTo":"Fazendo deploy em {scope}","rollout.release":"release","rollout.backToApp":"app","rollout.trafficLabel":"Tr\xE1fego na nova vers\xE3o","rollout.live":"{pct}% no ar","rollout.movingTo":"indo para {pct}%","rollout.move":"Mover tr\xE1fego","rollout.finalize":"Finalizar","rollout.rollback":"Reverter","rollout.confirmFinalize":"Finalizar e aposentar a vers\xE3o antiga?","rollout.confirmRollback":"Devolver TODO o tr\xE1fego para a vers\xE3o anterior?","rollout.log":"Log do deployment","rollout.waiting":"aguardando atividade\u2026","rollout.failed":"Falhou: {message}","rollout.deployment":"Deployment #{id}","rollout.busyMove":"Movendo tr\xE1fego\u2026","rollout.busyFinalize":"Finalizando\u2026","rollout.busyRollback":"Revertendo\u2026","rollout.autoDone":"Pronto \u2014 a release est\xE1 totalmente no ar.","rollout.autoRolledBack":"Revertido \u2014 a vers\xE3o anterior est\xE1 atendendo o tr\xE1fego.","rollout.autoFailed":"O deployment falhou \u2014 a vers\xE3o anterior continua atendendo.","rollout.autoWaiting":"Aguardando inst\xE2ncias \u2014 os controles liberam quando o rollout estiver em execu\xE7\xE3o.","rollout.autoFull":"Todo o tr\xE1fego na nova vers\xE3o \u2014 finalize para aposentar a antiga.","rollout.autoLabel":"Avan\xE7o autom\xE1tico","rollout.autoOff":"desligado","rollout.trafficHelp":"Arraste para mover o tr\xE1fego agora; o avan\xE7o autom\xE1tico leva a 100%.","rollout.appLogs":"Logs da aplica\xE7\xE3o","rollout.appLogsEmpty":"ainda sem logs da aplica\xE7\xE3o\u2026","logs.title":"{app} \xB7 logs","logs.heading":"Logs","logs.filter":"filtrar\u2026","logs.live":"ao vivo","logs.refresh":"Atualizar","logs.updated":"atualizado {time}","logs.stale":"sem atividade recente \xB7 \xFAltimo log {ago}","logs.wrap":"Quebrar linha","logs.settings":"Configura\xE7\xF5es","logs.timezone":"Fuso hor\xE1rio","logs.tzLocal":"Local","logs.tzUtc":"UTC","logs.copyAll":"Copiar tudo","logs.copied":"Copiado","logs.rangeLive":"Ao vivo","logs.range1m":"\xDAltimos 1m","logs.range15m":"\xDAltimos 15m","logs.range1h":"\xDAltima 1h","logs.range6h":"\xDAltimas 6h","logs.range24h":"\xDAltimas 24h","logs.rangeCustom":"Personalizado\u2026","logs.apply":"Aplicar","logs.from":"De","logs.to":"At\xE9","logs.empty":"ainda sem linhas de log\u2026","logs.noMatch":"nada corresponde ao filtro","logs.count":"{count} linha(s){scope}","logs.scopeSuffix":" \xB7 scope {scope}","logs.refreshFailed":"atualiza\xE7\xE3o falhou: {message}","metrics.title":"{app} \xB7 m\xE9tricas de {scope}","metrics.heading":"M\xE9tricas","metrics.live":"ao vivo","metrics.loading":"carregando {window}\u2026","metrics.refreshFailed":"atualiza\xE7\xE3o falhou: {message}","metrics.noData":"sem datapoints nesta janela","metrics.avgMax":"m\xE9d {avg} \xB7 m\xE1x {max}","params.title":"{app} \xB7 par\xE2metros","params.heading":"Par\xE2metros","params.value":"Valor","params.secret":"Secret","params.add":"Adicionar","params.addValue":"Adicionar valor","params.editValue":"Editar valor","params.parameter":"Par\xE2metro","params.allScopes":"Todos os scopes","params.effectiveFor":"Valores efetivos para {scope}","params.ctxApplication":"Aplica\xE7\xE3o","params.noValues":"Nenhum valor configurado","params.empty":"Ainda sem par\xE2metros \u2014 adicione um para configurar esta app.","params.readOnly":"somente leitura","params.unset":"n\xE3o definido","params.appliesTo":"Aplica-se a","params.targetApp":"Aplica\xE7\xE3o","params.targetAppHint":"todos os scopes","params.targetDimension":"Por dimens\xE3o","params.targetScope":"Scope","params.targetScopeHint":"apenas um scope","params.pickScope":"Escolha um scope","params.anyDim":"Qualquer {dim}","params.secretNewOnly":"apenas par\xE2metro novo","params.secretPlaceholder":"Insira um novo valor secreto","params.overrides":"Sobrescreve o valor existente de {ctx}","params.overwriteConfirm":"Sobrescrever?","params.cancel":"Cancelar","params.saveValue":"Salvar valor","params.savingValue":"Salvando\u2026","params.applyNote":"Valores alterados aplicam no pr\xF3ximo deploy.","params.unavailable":"Os valores existentes n\xE3o podem ser listados aqui \u2014 novos ainda podem ser adicionados abaixo.","params.resolveFailed":"N\xE3o foi poss\xEDvel resolver os valores: {message}","params.back":"Voltar","params.deleteParam":"Excluir par\xE2metro","params.deleteConfirm":"Excluir?","params.deleting":"Excluindo\u2026","params.deleteReadonly":"Injetado por um link de servi\xE7o \u2014 exclua o link para remov\xEA-lo.","params.notRestored":"Os dados deste painel n\xE3o foram restaurados.","params.refresh":"Atualizar","params.refreshing":"Atualizando\u2026","createApp.title":"Criar aplica\xE7\xE3o","createApp.name":"Nome","createApp.namespace":"Namespace","createApp.repository":"Reposit\xF3rio","createApp.newRepo":"Novo reposit\xF3rio","createApp.importRepo":"Importar existente","createApp.template":"Template","createApp.noTemplates":"Nenhum template dispon\xEDvel","createApp.repoUrl":"URL do reposit\xF3rio","createApp.editName":"Personalizar o nome do reposit\xF3rio","createApp.lockName":"Voltar ao nome gerado","createApp.importUrl":"URL do reposit\xF3rio existente","createApp.monorepo":"Este reposit\xF3rio \xE9 um monorepo","createApp.appPath":"Caminho da aplica\xE7\xE3o dentro do reposit\xF3rio","createApp.submit":"Criar aplica\xE7\xE3o","createApp.needName":"O nome \xE9 obrigat\xF3rio.","createApp.needNamespace":"Escolha um namespace.","createApp.needTemplate":"Escolha um template para o novo reposit\xF3rio.","createApp.needImportUrl":"Informe a URL do reposit\xF3rio para importar.","createApp.noBaseUrl":"Esta conta n\xE3o tem provedor git configurado \u2014 use \u201CImportar existente\u201D.","createApp.selectNamespaceFirst":"Escolha um namespace para gerar a URL do reposit\xF3rio.","createApp.failed":"Falhou: {message}","createApp.creatingTitle":"Criando {name}\u2026","createApp.readyTitle":"{name} est\xE1 pronta","createApp.failedTitle":"N\xE3o foi poss\xEDvel criar {name}","createApp.provisioning":"Provisionando\u2026","createApp.readyHint":"Fa\xE7a push de um commit para disparar o primeiro build, depois deploy.","createApp.readyHintNew":"Clone o repo novo em uma pasta, adicione seu c\xF3digo e fa\xE7a push para buildar e deployar.","createApp.failedHint":"A cria\xE7\xE3o falhou \u2014 abra o dashboard para ver o que deu errado.","createApp.openDashboard":"Abrir no dashboard","findApps.count":"{count} aplica\xE7\xE3o(\xF5es)","findApps.filter":"filtrar\u2026","findApps.across":"em {ns} namespace(s)","findApps.noMatch":"Nada corresponde ao filtro.","findApps.loadMore":"Carregar mais {more}","findApps.hint":"Clique em uma aplica\xE7\xE3o para abrir seu painel.","buildsW.title":"{app} \xB7 {count} build(s)","buildsW.none":"Ainda sem builds \u2014 fa\xE7a push de um commit para o CI gerar um.","buildsW.buildTitle":"Build #{id}","buildsW.back":"Builds","buildsW.loadingAssets":"Carregando assets\u2026","buildsW.noAssets":"Nenhum asset para este build.","buildsW.noAssetsRunning":"Ainda sem assets \u2014 o build ainda est\xE1 rodando.","buildsW.noAssetsFailed":"Nenhum asset \u2014 o build falhou antes de produzir algum.","buildsW.assets":"Assets","buildsW.newRelease":"Nova release","buildsW.creatingRelease":"Criando release\u2026","buildsW.releaseDone":"Release {semver} criada.","buildsW.releasedAs":"Com release {semver}","releasesW.title":"{app} \xB7 {count} release(s)","releasesW.none":"Ainda sem releases.","releasesW.deploy":"Deploy","deploymentsW.title":"{app} \xB7 {count} deployment(s)","deploymentsW.none":"Ainda sem deployments.","deploymentsW.group":"{count} scopes","approvalsW.title":"{app} \xB7 {count} aprova\xE7\xE3o(\xF5es)","approvalsW.none":"Nenhuma aprova\xE7\xE3o pendente.","approvalsW.approve":"Aprovar","approvalsW.approving":"Aprovando\u2026","approvalsW.cancel":"Cancelar","approvalsW.cancelling":"Cancelando\u2026","approvalsW.confirmCancel":"Cancelar esta solicita\xE7\xE3o de aprova\xE7\xE3o?","approvalsW.by":"por {who}","overviewW.title":"Sa\xFAde da org \xB7 {count} app(s) escaneada(s)","overviewW.truncated":"mostrando as primeiras apps \u2014 refine com uma query para o resto","overviewW.active":"Em rollout ({count})","overviewW.noActive":"Nada em deploy no momento.","overviewW.trouble":"Precisa de aten\xE7\xE3o ({count})","overviewW.noTrouble":"Nenhum scope com falha ou revertido.","servicesW.title":"{app} \xB7 {count} depend\xEAncia(s)","servicesW.none":"Nenhuma depend\xEAncia anexada.","servicesW.catalog":"Dispon\xEDveis para provisionar","servicesW.dashboard":"Abrir no dashboard","servicesW.provisionHint":"Provisionar uma depend\xEAncia \xE9 um fluxo guiado \u2014 abra o dashboard para adicionar uma.","serviceCreateW.pick":"Provisionar uma depend\xEAncia para {app}","serviceCreateW.name":"Nome","serviceCreateW.namePlaceholder":"nome do servi\xE7o","serviceCreateW.params":"Configura\xE7\xE3o","serviceCreateW.linkParams":"Configura\xE7\xE3o do link","serviceCreateW.linkTo":"Linkar a","serviceCreateW.wholeApp":"a app inteira (todos os scopes)","serviceCreateW.costNote":"Provisionar cria recursos cloud reais (com custo).","serviceCreateW.provision":"Provisionar","serviceCreateW.provisioning":"Provisionando\u2026","serviceCreateW.creating":"Provisionando {name}\u2026","serviceCreateW.ready":"{name} est\xE1 pronto","serviceCreateW.failed":"N\xE3o foi poss\xEDvel provisionar {name}","serviceCreateW.stepRequested":"Servi\xE7o solicitado","serviceCreateW.stepResources":"Provisionando recursos cloud","serviceCreateW.stepLinked":"Linkado \u2014 par\xE2metros de conex\xE3o no pr\xF3ximo deploy","serviceCreateW.paramsNote":"Seus par\xE2metros de conex\xE3o aparecem ap\xF3s o pr\xF3ximo deploy.","serviceCreateW.linkNote":"Quando estiver ativo, linke-o a um scope para conectar seus par\xE2metros de conex\xE3o.","serviceCreateW.dashboard":"Abrir no dashboard","serviceCreateW.failedHint":"Abra o dashboard para ver o que deu errado.","serviceLinkW.pick":"Linkar um servi\xE7o a {app}","serviceLinkW.service":"Servi\xE7o","serviceLinkW.note":"Um link de credenciais (ex. um usu\xE1rio de banco de dados) provisiona recursos.","serviceLinkW.link":"Linkar","serviceLinkW.linking":"Linkando\u2026","serviceLinkW.creating":"Linkando {service}\u2026","serviceLinkW.ready":"{service} est\xE1 linkado","serviceLinkW.failed":"N\xE3o foi poss\xEDvel linkar {service}","serviceLinkW.stepRequested":"Link solicitado","serviceLinkW.stepProvisioning":"Conectando","serviceLinkW.paramsNote":"Seus par\xE2metros de conex\xE3o chegam ao runtime no pr\xF3ximo deploy.","serviceActionW.pickTarget":"Rodar uma a\xE7\xE3o em {app}","serviceActionW.pickAction":"Qual a\xE7\xE3o em {name}?","serviceActionW.params":"Par\xE2metros","serviceActionW.note":"Uma custom action roda uma opera\xE7\xE3o definida pelo time de plataforma.","serviceActionW.run":"Rodar","serviceActionW.running":"Rodando\u2026","serviceActionW.runningTitle":"Rodando {action}\u2026","serviceActionW.ran":"{action} rodou","serviceActionW.failed":"{action} falhou","serviceActionW.stepRequested":"A\xE7\xE3o solicitada","serviceActionW.stepRunning":"Rodando","serviceActionW.runningNote":"A a\xE7\xE3o roda de forma ass\xEDncrona; seu resultado aparece quando termina.","serviceActionW.failedHint":"Abra o dashboard para ver o que deu errado.","serviceDeleteW.pickTarget":"Deletar em {app}","serviceDeleteW.warning":"Isso destr\xF3i o recurso e seus dados. N\xE3o pode ser desfeito.","serviceDeleteW.delete":"Deletar","serviceDeleteW.deleting":"Deletando\u2026","serviceDeleteW.confirm":"Deletar?","serviceDeleteW.stepRequested":"Dele\xE7\xE3o solicitada","serviceDeleteW.stepRemoving":"Removendo","serviceDeleteW.removed":"{name} foi deletado","serviceDeleteW.deprovisioning":"Deletando {name}\u2026","serviceDeleteW.removedNote":"O registro e seus recursos j\xE1 n\xE3o existem.","serviceDeleteW.deprovisioningNote":"Um agente est\xE1 desprovisionando seus recursos; o registro sai quando termina."},O_={en:T_,es:j_,pt:R_};function Jm(e){let r=e?.structuredContent?._locale;return r==="es"||r==="pt"?r:"en"}function Km(e){let r=O_[e];return(n,i)=>r[n].replace(/\{(\w+)\}/g,(t,o)=>i?.[o]!==void 0?String(i[o]):t)}var Gm=Gr(Km("en")),Qm=Gm.Provider,Ym=()=>fi(Gm),Xm=e=>Km(e);function ef(e){return{render:function(r){gu(r,e)},unmount:function(){vu(e)}}}function tf(e){let r=document.getElementById("root");r&&ef(r).render(e)}var A_=0;function h(e,r,n,i,t,o){r||(r={});var a,s,u=r;if("ref"in u)for(s in u={},r)s=="ref"?a=r[s]:u[s]=r[s];var p={type:e,props:u,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--A_,__i:-1,__u:0,__source:t,__self:o};if(typeof e=="function"&&(a=e.defaultProps))for(s in a)u[s]===void 0&&(u[s]=a[s]);return O.vnode&&O.vnode(p),p}var D_={clock:{body:h(M,{children:[h("circle",{cx:"12",cy:"12",r:"10"}),h("polyline",{points:"12 6 12 12 16 14"})]})},play:{fill:!0,body:h("polygon",{points:"6 3 20 12 6 21 6 3"})},pause:{fill:!0,body:h(M,{children:[h("rect",{x:"6",y:"4",width:"4",height:"16",rx:"1"}),h("rect",{x:"14",y:"4",width:"4",height:"16",rx:"1"})]})},refresh:{body:h(M,{children:[h("path",{d:"M21 12a9 9 0 1 1-2.64-6.36"}),h("polyline",{points:"21 3 21 8 16 8"})]})},rocket:{body:h(M,{children:[h("path",{d:"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z"}),h("path",{d:"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z"}),h("path",{d:"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0"}),h("path",{d:"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"})]})},logs:{body:h(M,{children:[h("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),h("polyline",{points:"14 2 14 8 20 8"}),h("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),h("line",{x1:"16",y1:"17",x2:"8",y2:"17"}),h("line",{x1:"10",y1:"9",x2:"8",y2:"9"})]})},metrics:{body:h(M,{children:[h("polyline",{points:"22 7 13.5 15.5 8.5 10.5 2 17"}),h("polyline",{points:"16 7 22 7 22 13"})]})},lock:{body:h(M,{children:[h("rect",{x:"3",y:"11",width:"18",height:"11",rx:"2",ry:"2"}),h("path",{d:"M7 11V7a5 5 0 0 1 10 0v4"})]})},edit:{body:h("path",{d:"M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"})},copy:{body:h(M,{children:[h("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),h("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]})},check:{body:h("polyline",{points:"20 6 9 17 4 12"})},package:{body:h(M,{children:[h("path",{d:"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z"}),h("path",{d:"m3.3 7 8.7 5 8.7-5"}),h("path",{d:"M12 22V12"})]})},x:{body:h(M,{children:[h("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),h("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})},plus:{body:h(M,{children:[h("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),h("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]})},chevronDown:{body:h("polyline",{points:"6 9 12 15 18 9"})},chevronLeft:{body:h("polyline",{points:"15 18 9 12 15 6"})},chevronRight:{body:h("polyline",{points:"9 18 15 12 9 6"})},arrowLeft:{body:h(M,{children:[h("line",{x1:"19",y1:"12",x2:"5",y2:"12"}),h("polyline",{points:"12 19 5 12 12 5"})]})},sliders:{body:h(M,{children:[h("line",{x1:"21",y1:"4",x2:"14",y2:"4"}),h("line",{x1:"10",y1:"4",x2:"3",y2:"4"}),h("line",{x1:"21",y1:"12",x2:"12",y2:"12"}),h("line",{x1:"8",y1:"12",x2:"3",y2:"12"}),h("line",{x1:"21",y1:"20",x2:"16",y2:"20"}),h("line",{x1:"12",y1:"20",x2:"3",y2:"20"}),h("line",{x1:"14",y1:"2",x2:"14",y2:"6"}),h("line",{x1:"8",y1:"10",x2:"8",y2:"14"}),h("line",{x1:"16",y1:"18",x2:"16",y2:"22"})]})}},Il=({name:e,size:r=14,className:n})=>{let i=D_[e];return h("svg",{className:["icon",n].filter(Boolean).join(" "),width:r,height:r,viewBox:"0 0 24 24",fill:i.fill?"currentColor":"none",stroke:i.fill?"none":"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",focusable:"false",children:i.body})};var Pl=({children:e})=>h("div",{className:"card",children:e}),Nl=({children:e})=>h("div",{className:"row",children:e});var rf=({tone:e,children:r})=>h("div",{className:`note${e?` ${e}`:""}`,children:r});var ti=({variant:e,on:r,className:n,...i})=>h("button",{className:[e,r?"on":"",n].filter(Boolean).join(" "),...i});var Q=({w:e="100%",h:r=12,r:n=6})=>h("div",{className:"skel",style:{width:e,height:r,borderRadius:n}}),nf=({variant:e})=>h(Pl,{children:[h(Nl,{children:[h(Q,{w:170,h:16}),e!=="form"&&h(M,{children:[h("div",{className:"grow"}),h(Q,{w:110,h:28,r:8})]})]}),e==="list"&&h("div",{className:"skel-rows",children:[0,1,2,3,4,5].map(r=>h("div",{className:"skel-row",children:[h(Q,{w:8,h:8,r:999}),h(Q,{w:140,h:13}),h("div",{className:"grow"}),h(Q,{w:90,h:11})]},r))}),e==="panel"&&h(M,{children:[h("div",{className:"section",children:[h(Q,{w:64,h:10}),h("div",{style:{marginTop:10,display:"flex",flexDirection:"column",gap:10},children:[0,1].map(r=>h("div",{className:"skel-card",children:[h(Q,{w:r?"45%":"55%",h:14}),h("div",{style:{height:8}}),h(Q,{w:r?"70%":"85%",h:11})]},r))})]}),h("div",{className:"section",children:[h(Q,{w:64,h:10}),h("div",{style:{marginTop:10,display:"flex",gap:8},children:[0,1,2].map(r=>h(Q,{w:72,h:24,r:999},r))})]}),h("div",{className:"section",style:{display:"flex",gap:8},children:[h(Q,{w:132,h:34,r:9}),h(Q,{w:80,h:34,r:9})]})]}),e==="table"&&h("div",{className:"skel-rows",children:[0,1,2,3].map(r=>h("div",{className:"skel-row",children:[h(Q,{w:"30%",h:13}),h("div",{className:"grow"}),h(Q,{w:"42%",h:13}),h(Q,{w:18,h:13})]},r))}),e==="grid"&&h("div",{className:"skel-grid",children:[0,1,2,3].map(r=>h("div",{className:"skel-card",children:[h(Q,{w:"50%",h:10}),h("div",{style:{height:8}}),h(Q,{w:"35%",h:20}),h("div",{style:{height:8}}),h(Q,{w:"100%",h:40,r:8})]},r))}),e==="logs"&&h("div",{style:{marginTop:14},children:h(Q,{w:"100%",h:150,r:10})}),e==="form"&&h("div",{className:"skel-rows",children:[[0,1,2].map(r=>h("div",{children:[h(Q,{w:88,h:10}),h("div",{style:{height:7}}),h(Q,{w:"100%",h:32,r:8})]},r)),h(Q,{w:150,h:34,r:9})]})]});var of=({points:e})=>{let r=De(null);return Pe(()=>{let n=r.current;if(!n)return;let i=window.devicePixelRatio||1,t=n.clientWidth||200,o=n.clientHeight||44;n.width=t*i,n.height=o*i;let a=n.getContext("2d");if(!a)return;a.scale(i,i),a.clearRect(0,0,t,o);let s=getComputedStyle(document.documentElement);if(!e.length){a.fillStyle=s.getPropertyValue("--muted"),a.font="11px sans-serif",a.fillText("no data",4,o/2);return}let u=e.map(d=>d.v),p=Math.min(...u),f=Math.max(...u)-p||1,l=s.getPropertyValue("--accent").trim()||"#6366f1",_=d=>d/Math.max(1,e.length-1)*(t-4)+2,g=d=>o-5-(d-p)/f*(o-12);a.beginPath(),e.forEach((d,y)=>{y===0?a.moveTo(_(y),g(d.v)):a.lineTo(_(y),g(d.v))}),a.strokeStyle=l,a.lineWidth=1.6,a.stroke(),a.lineTo(_(e.length-1),o-2),a.lineTo(_(0),o-2),a.closePath(),a.globalAlpha=.12,a.fillStyle=l,a.fill(),a.globalAlpha=1},[e]),h("canvas",{ref:r})},af=({scopes:e,onPick:r})=>{let n=Ym();return h("div",{className:"row",style:{marginTop:10},children:[h("span",{className:"sub",children:n("chooser.pick")}),e.map(i=>h(ti,{variant:"small",onClick:()=>r(i.name),children:i.name},i.name))]})};var C_=["1h","3h","24h","7d"];function E_(){let{result:e,call:r,connected:n}=Bm("np-metrics"),i=Jm(e),t=Jt(()=>Xm(i),[i]),[o,a]=Ae(!1),[s,u]=Ae({win:"3h",series:[]}),p=De(s);p.current=s;let f=Ce(g=>{let d=g;if(d){if(Array.isArray(d.choose_scope)&&d.choose_scope.length){u(y=>({...y,app:d.app??y.app,appName:d.app_name??y.appName,chooser:d.choose_scope}));return}Array.isArray(d.series)&&u(y=>({...y,app:d.app??y.app,appName:d.app_name??y.appName,scope:d.scope??y.scope,scopes:d.scopes??y.scopes,win:d.window??y.win,series:d.series??[],chooser:void 0,note:d.series?.some(k=>k.points.length)?void 0:t("metrics.noData")}))}},[t]);Pe(()=>f(e?.structuredContent),[e,f]);let l=Ce(async(g={})=>{let{app:d,scope:y,win:k}=p.current;if(d){u(I=>({...I,note:t("metrics.loading",{window:g.win??k})}));try{let I={app:d,window:g.win??k};(g.scope??y)&&(I.scope=g.scope??y),f((await r(_u.applicationMetricList,I)).structuredContent)}catch(I){u(x=>({...x,note:t("metrics.refreshFailed",{message:hi(I)})}))}}},[f,r,t]);Pe(()=>{if(!o)return;let g=setInterval(()=>{l()},3e4);return l(),()=>clearInterval(g)},[o,l]);let _=De(!1);return Pe(()=>{_.current||!n||!s.app||(_.current=!0,!s.chooser&&!o&&l())},[n,s.app,s.chooser]),e?h(Qm,{value:t,children:h(Pl,{children:[h(Nl,{children:[h("div",{className:"title grow",children:s.appName?t("metrics.title",{app:s.appName,scope:s.scope??""}):t("metrics.heading")}),h(ti,{variant:"small",className:"hasicon",on:o,onClick:()=>a(g=>!g),children:[h(Il,{name:o?"pause":"play"})," ",t("metrics.live")]})]}),s.chooser?h(af,{scopes:s.chooser,onPick:g=>{u(d=>({...d,scope:g,chooser:void 0})),l({scope:g})}}):h(M,{children:[h("div",{className:"toolbar",children:[s.scopes?.length?h("select",{value:s.scope??"",onChange:g=>{let d=g.target.value;u(y=>({...y,scope:d})),l({scope:d})},children:s.scopes.map(g=>h("option",{value:g.name,children:g.name},g.name))}):null,C_.map(g=>h(ti,{variant:"small",on:s.win===g,onClick:()=>{u(d=>({...d,win:g})),l({win:g})},children:g},g))]}),h("div",{className:"grid",children:s.series.map(g=>h("div",{className:"metric-card",children:[h("div",{className:"label",children:g.label}),h("div",{className:"val",children:[en(g.last)," ",h("small",{children:g.unit})]}),h(of,{points:g.points}),h("div",{className:"sub",style:{marginTop:4,fontSize:11},children:t("metrics.avgMax",{avg:en(g.avg),max:en(g.max)})})]},g.id))})]}),h(rf,{children:s.note})]})}):h(nf,{variant:"grid"})}tf(h(E_,{}));})();
1223
+ container holding the app. Specify either width or maxWidth, and either height or maxHeight.`),locale:c.string().optional().describe("User's language and region preference in BCP 47 format."),timeZone:c.string().optional().describe("User's timezone in IANA format."),userAgent:c.string().optional().describe("Host application identifier."),platform:c.union([c.literal("web"),c.literal("desktop"),c.literal("mobile")]).optional().describe("Platform type for responsive design decisions."),deviceCapabilities:c.object({touch:c.boolean().optional().describe("Whether the device supports touch input."),hover:c.boolean().optional().describe("Whether the device supports hover interactions.")}).optional().describe("Device input capabilities."),safeAreaInsets:c.object({top:c.number().describe("Top safe area inset in pixels."),right:c.number().describe("Right safe area inset in pixels."),bottom:c.number().describe("Bottom safe area inset in pixels."),left:c.number().describe("Left safe area inset in pixels.")}).optional().describe("Mobile safe area boundaries in pixels.")}).passthrough(),z_=c.object({method:c.literal("ui/notifications/host-context-changed"),params:Wm.describe("Partial context update containing only changed fields.")}),OS=c.object({method:c.literal("ui/update-model-context"),params:c.object({content:c.array(Mt).optional().describe("Context content blocks (text, image, etc.)."),structuredContent:c.record(c.string(),c.unknown().describe("Structured content for machine-readable context data.")).optional().describe("Structured content for machine-readable context data.")})}),AS=c.object({method:c.literal("ui/initialize"),params:c.object({appInfo:Dr.describe("App identification (name and version)."),appCapabilities:y_.describe("Features and capabilities this app provides."),protocolVersion:c.string().describe("Protocol version this app supports.")})}),S_=c.object({protocolVersion:c.string().describe('Negotiated protocol version string (e.g., "2025-11-21").'),hostInfo:Dr.describe("Host application identification and version."),hostCapabilities:b_.describe("Features and capabilities provided by the host."),hostContext:Wm.describe("Rich context about the host environment.")}).passthrough(),w_={target:"draft-2020-12"};async function Lm(e,r){let n=e["~standard"];if(n.jsonSchema)return n.jsonSchema[r](w_);if(n.vendor==="zod"){let{z:i}=await Promise.resolve().then(()=>(jr(),rl));return i.toJSONSchema(e,{io:r})}throw Error(`Schema (vendor: ${n.vendor}) does not implement Standard JSON Schema (~standard.jsonSchema). Use a library that does (zod v4, ArkType, Valibot) or wrap your schema accordingly.`)}async function Mm(e,r,n=""){let i=await e["~standard"].validate(r);if(i.issues){let t=i.issues.map(o=>{let a=o.path?.map(s=>typeof s=="object"?s.key:s).join(".");return a?`${a}: ${o.message}`:o.message}).join("; ");throw Error(n+t)}return i.value}function Fm(e,r=document.documentElement){for(let[n,i]of Object.entries(e))i!==void 0&&r.style.setProperty(n,i)}function qm(e){if(document.getElementById("__mcp-host-fonts"))return;let r=document.createElement("style");r.id="__mcp-host-fonts",r.textContent=e,document.head.appendChild(r)}var ei=class ei extends kl{constructor(n,i={},t={autoResize:!0}){super(t);L(this,"_appInfo");L(this,"_capabilities");L(this,"options");L(this,"_hostCapabilities");L(this,"_hostInfo");L(this,"_hostContext");L(this,"_registeredTools",{});L(this,"_initializedSent",!1);L(this,"eventSchemas",{toolinput:m_,toolinputpartial:f_,toolresult:k_,toolcancelled:g_,hostcontextchanged:z_});L(this,"_everHadListener",new Set);L(this,"_toolHandlersInitialized",!1);L(this,"_onteardown");L(this,"_oncalltool");L(this,"_onlisttools");L(this,"sendOpenLink",this.openLink);this._appInfo=n,this._capabilities=i,this.options=t,t.allowUnsafeEval||c.config({jitless:!0}),this.setRequestHandler(Zt,o=>(console.log("Received ping:",o.params),{})),this.setEventHandler("hostcontextchanged",void 0)}_assertInitialized(n){if(this._initializedSent)return;let i=`[ext-apps] App.${n}() called before connect() completed the ui/initialize handshake. Await app.connect() before calling this method, or move data loading to an ontoolresult handler.`;if(this.options?.strict)throw Error(i);console.warn(`${i}. This will throw in a future release.`)}_assertHandlerTiming(n){if(!ei.ONE_SHOT_EVENTS.has(n)||this._everHadListener.has(n)||(this._everHadListener.add(n),!this._initializedSent))return;let i=`[ext-apps] "${String(n)}" handler registered after connect() completed the ui/initialize handshake. The host may have already sent this notification. Register handlers before calling app.connect().`;if(this.options?.strict)throw Error(i);console.warn(i)}setEventHandler(n,i){i&&this._assertHandlerTiming(n),super.setEventHandler(n,i)}addEventListener(n,i){this._assertHandlerTiming(n),super.addEventListener(n,i)}onEventDispatch(n,i){n==="hostcontextchanged"&&(this._hostContext={...this._hostContext,...i})}registerCapabilities(n){if(this.transport)throw Error("Cannot register capabilities after transport is established");this._capabilities=Um(this._capabilities,n)}registerTool(n,i,t){if(this._registeredTools[n])throw Error(`Tool ${n} is already registered`);let o=this,a=()=>{o._initializedSent&&o._capabilities.tools?.listChanged&&o.sendToolListChanged()},s=i.inputSchema!==void 0,u={title:i.title,description:i.description,inputSchema:i.inputSchema,outputSchema:i.outputSchema,annotations:i.annotations,_meta:i._meta,enabled:!0,enable(){this.enabled=!0,a()},disable(){this.enabled=!1,a()},update(p){Object.assign(this,p),a()},remove(){o._registeredTools[n]===u&&(delete o._registeredTools[n],a())},handler:async(p,f)=>{if(!u.enabled)throw Error(`Tool ${n} is disabled`);let l;if(s){let _=u.inputSchema,g=_?await Mm(_,p??{},`Invalid input for tool ${n}: `):p??{};l=await t(g,f)}else l=await t(f);return u.outputSchema&&!l.isError&&(l.structuredContent=await Mm(u.outputSchema,l.structuredContent,`Invalid output for tool ${n}: `)),l}};return this._registeredTools[n]=u,!this._capabilities.tools&&!this.transport&&this.registerCapabilities({tools:{listChanged:!0}}),this.ensureToolHandlersInitialized(),a(),u}ensureToolHandlersInitialized(){this._toolHandlersInitialized||(this._toolHandlersInitialized=!0,this.oncalltool=async(n,i)=>{let t=this._registeredTools[n.name];if(!t)throw Error(`Tool ${n.name} not found`);return t.handler(n.arguments,i)},this.onlisttools=async(n,i)=>({tools:await Promise.all(Object.entries(this._registeredTools).filter(([t,o])=>o.enabled).map(async([t,o])=>{let a={name:t,title:o.title,description:o.description,inputSchema:o.inputSchema?await Lm(o.inputSchema,"input"):{type:"object",properties:{}}};return o.outputSchema&&(a.outputSchema=await Lm(o.outputSchema,"output")),o.annotations&&(a.annotations=o.annotations),o._meta&&(a._meta=o._meta),a}))}))}async sendToolListChanged(n={}){this._assertInitialized("sendToolListChanged"),await this.notification({method:"notifications/tools/list_changed",params:n})}getHostCapabilities(){return this._hostCapabilities}getHostVersion(){return this._hostInfo}getHostContext(){return this._hostContext}get ontoolinput(){return this.getEventHandler("toolinput")}set ontoolinput(n){this.setEventHandler("toolinput",n)}get ontoolinputpartial(){return this.getEventHandler("toolinputpartial")}set ontoolinputpartial(n){this.setEventHandler("toolinputpartial",n)}get ontoolresult(){return this.getEventHandler("toolresult")}set ontoolresult(n){this.setEventHandler("toolresult",n)}get ontoolcancelled(){return this.getEventHandler("toolcancelled")}set ontoolcancelled(n){this.setEventHandler("toolcancelled",n)}get onhostcontextchanged(){return this.getEventHandler("hostcontextchanged")}set onhostcontextchanged(n){this.setEventHandler("hostcontextchanged",n)}get onteardown(){return this._onteardown}set onteardown(n){this.warnIfRequestHandlerReplaced("onteardown",this._onteardown,n),this._onteardown=n,this.replaceRequestHandler(__,(i,t)=>{if(!this._onteardown)throw Error("No onteardown handler set");return this._onteardown(i.params,t)})}get oncalltool(){return this._oncalltool}set oncalltool(n){this.warnIfRequestHandlerReplaced("oncalltool",this._oncalltool,n),this._oncalltool=n,this.replaceRequestHandler(_l,(i,t)=>{if(!this._oncalltool)throw Error("No oncalltool handler set");return this._oncalltool(i.params,t)})}get onlisttools(){return this._onlisttools}set onlisttools(n){this.warnIfRequestHandlerReplaced("onlisttools",this._onlisttools,n),this._onlisttools=n,this.replaceRequestHandler(vl,(i,t)=>{if(!this._onlisttools)throw Error("No onlisttools handler set");return this._onlisttools(i.params,t)})}assertCapabilityForMethod(n){switch(n){case"sampling/createMessage":if(!this._hostCapabilities?.sampling)throw Error(`Host does not support sampling (required for ${n})`);break}}assertRequestHandlerCapability(n){switch(n){case"tools/call":case"tools/list":if(!this._capabilities.tools)throw Error(`Client does not support tool capability (required for ${n})`);return;case"ping":case"ui/resource-teardown":return;default:throw Error(`No handler for method ${n} registered`)}}assertNotificationCapability(n){}assertTaskCapability(n){throw Error("Tasks are not supported in MCP Apps")}assertTaskHandlerCapability(n){throw Error("Task handlers are not supported in MCP Apps")}async callServerTool(n,i){if(this._assertInitialized("callServerTool"),typeof n=="string")throw Error(`callServerTool() expects an object as its first argument, but received a string ("${n}"). Did you mean: callServerTool({ name: "${n}", arguments: { ... } })?`);return await this.request({method:"tools/call",params:n},Wt,{onprogress:()=>{},resetTimeoutOnProgress:!0,...i})}async readServerResource(n,i){return this._assertInitialized("readServerResource"),await this.request({method:"resources/read",params:n},pl,i)}async listServerResources(n,i){return this._assertInitialized("listServerResources"),await this.request({method:"resources/list",params:n},ll,i)}async createSamplingMessage(n,i){this._assertInitialized("createSamplingMessage");let t=n.tools?yl:bl;return await this.request({method:"sampling/createMessage",params:n},t,i)}sendMessage(n,i){return this._assertInitialized("sendMessage"),this.request({method:"ui/message",params:n},d_,i)}sendLog(n){return this.notification({method:"notifications/message",params:n})}updateModelContext(n,i){return this._assertInitialized("updateModelContext"),this.request({method:"ui/update-model-context",params:n},Mo,i)}openLink(n,i){return this._assertInitialized("openLink"),this.request({method:"ui/open-link",params:n},u_,i)}downloadFile(n,i){return this._assertInitialized("downloadFile"),this.request({method:"ui/download-file",params:n},p_,i)}requestTeardown(n={}){return this.notification({method:"ui/notifications/request-teardown",params:n})}requestDisplayMode(n,i){return this._assertInitialized("requestDisplayMode"),this.request({method:"ui/request-display-mode",params:n},x_,i)}sendSizeChanged(n){return this.notification({method:"ui/notifications/size-changed",params:n})}setupSizeChangedNotifications(){let n=!1,i=0,t=0,o=()=>{n||(n=!0,requestAnimationFrame(()=>{n=!1;let s=document.documentElement,u=s.style.height;s.style.height="max-content";let p=Math.ceil(s.getBoundingClientRect().height);s.style.height=u;let f=Math.ceil(window.innerWidth);(f!==i||p!==t)&&(i=f,t=p,this.sendSizeChanged({width:f,height:p}))}))};o();let a=new ResizeObserver(o);return a.observe(document.documentElement),a.observe(document.body),()=>a.disconnect()}async connect(n=new zl(window.parent,window.parent),i){if(this.transport)throw Error("App is already connected. Call close() before connecting again.");this._initializedSent=!1,await super.connect(n);try{let t=await this.request({method:"ui/initialize",params:{appCapabilities:this._capabilities,appInfo:this._appInfo,protocolVersion:i_}},S_,i);if(t===void 0)throw Error(`Server sent invalid initialize result: ${t}`);this._hostCapabilities=t.hostCapabilities,this._hostInfo=t.hostInfo,this._hostContext=t.hostContext,await this.notification({method:"ui/notifications/initialized"}),this._initializedSent=!0,this.options?.autoResize&&this.setupSizeChangedNotifications()}catch(t){throw this.close(),t}}};L(ei,"ONE_SHOT_EVENTS",new Set(["toolinput","toolinputpartial","toolresult","toolcancelled"]));var Xo=ei;var I_="nullplatform/data";function Hm(e){let r=e._meta?.[I_];return r&&typeof r=="object"?{...e,structuredContent:{...e.structuredContent??{},...r}}:e}function P_(e){if(!e)return;let r=e.trim().toLowerCase(),n,i,t,o=/^#([0-9a-f]{3}|[0-9a-f]{6})$/.exec(r)?.[1];if(o){let a=o.length===3?o.split("").map(s=>s+s).join(""):o;n=parseInt(a.slice(0,2),16),i=parseInt(a.slice(2,4),16),t=parseInt(a.slice(4,6),16)}else{let a=/^rgba?\(\s*([\d.]+)[ ,]+([\d.]+)[ ,]+([\d.]+)/.exec(r);a&&([n,i,t]=[Number(a[1]),Number(a[2]),Number(a[3])]);let s=/^hsla?\(\s*[\d.]+[ ,]+[\d.]+%?[ ,]+([\d.]+)%/.exec(r);if(s)return Number(s[1])/100}if(!(n===void 0||i===void 0||t===void 0))return(.2126*n+.7152*i+.0722*t)/255}function N_(e){if(e.theme==="dark"||e.theme==="light")return e.theme;let r=e.styles?.variables;if(!r)return;let n=P_(r["--color-background-primary"]??r["--color-background-secondary"]);if(n!==void 0)return n<.5?"dark":"light"}function Vm(e){if(!e)return;let r=document.documentElement,n=e.styles?.variables,i=N_(e);i&&(r.classList.toggle("dark",i==="dark"),r.classList.toggle("light",i==="light"),r.style.colorScheme=i);try{n&&Fm(n),e.styles?.css?.fonts&&qm(e.styles.css.fonts)}catch{}console.debug("[np-widget] theme:",e.theme,"->",i??"os-fallback","| tokens:",!!n,"| fonts:",!!e.styles?.css?.fonts)}function Bm(e){let[r,n]=Ae(null),[i,t]=Ae(!1),o=De(null);Pe(()=>{let p=new Xo({name:e,version:"0.3.0"},{},{autoResize:!0});o.current=p,p.ontoolresult=f=>n(Hm(f)),p.onhostcontextchanged=f=>Vm(f),p.connect().then(()=>{Vm(p.getHostContext()),t(!0)}).catch(()=>t(!1))},[e]);let a=Ce(async(p,f)=>{if(!o.current)throw new Error("not connected");return Hm(await o.current.callServerTool({name:p,arguments:f}))},[]),s=Ce(p=>{o.current?.sendMessage({role:"user",content:[{type:"text",text:p}]}).catch(()=>{})},[]),u=Ce(p=>{try{o.current?.updateModelContext({content:[{type:"text",text:p}]}).catch(()=>{})}catch{}},[]);return{result:r,call:a,send:s,brief:u,connected:i}}var T_={"confirm.yes":"Yes, do it","confirm.no":"Cancel","chooser.pick":"pick a scope:","term.empty":"no output yet\u2026","term.loading":"fetching logs\u2026","term.copyLine":"copy line",hint:"Next:",loadMore:"Load more","panel.scopes":"Scopes","panel.releases":"Releases","panel.latestBuild":"Latest build","panel.noScopes":"No scopes yet \u2014 create one to have somewhere to deploy.","panel.scopePlaceholder":"scope name, e.g. dev","panel.typePlaceholder":"type\u2026","panel.pickScope":"Pick a scope","panel.createScope":"Create scope","panel.ship":"ship","panel.live":"live","panel.openRollout":"Open rollout","panel.nothingDeployed":"nothing deployed","panel.noReleases":"none yet","panel.noBuild":"none \u2014 push a commit so CI builds","panel.deployLatest":"Deploy latest","panel.logs":"Logs","panel.metrics":"Metrics","panel.pickType":"Pick a scope type and create again.","panel.waitingData":"waiting for data\u2026","panel.backToList":"apps","rollout.deployingTo":"Deploying to {scope}","rollout.release":"release","rollout.backToApp":"app","rollout.trafficLabel":"Traffic on new version","rollout.live":"{pct}% live","rollout.movingTo":"moving to {pct}%","rollout.move":"Move traffic","rollout.finalize":"Finalize","rollout.rollback":"Rollback","rollout.confirmFinalize":"Finalize and retire the old version?","rollout.confirmRollback":"Return ALL traffic to the previous version?","rollout.log":"Deployment log","rollout.waiting":"waiting for activity\u2026","rollout.failed":"Failed: {message}","rollout.deployment":"Deployment #{id}","rollout.busyMove":"Moving traffic\u2026","rollout.busyFinalize":"Finalizing\u2026","rollout.busyRollback":"Rolling back\u2026","rollout.autoDone":"Done \u2014 the release is fully live.","rollout.autoRolledBack":"Rolled back \u2014 previous version is serving traffic.","rollout.autoFailed":"Deployment failed \u2014 previous version keeps serving.","rollout.autoWaiting":"Waiting for instances \u2014 controls unlock when the rollout is running.","rollout.autoFull":"All traffic on the new version \u2014 finalize to retire the old one.","rollout.autoLabel":"Auto-advance","rollout.autoOff":"off","rollout.trafficHelp":"Drag to move traffic now; auto-advance ramps it to 100%.","rollout.appLogs":"Application logs","rollout.appLogsEmpty":"no application logs yet\u2026","logs.title":"{app} \xB7 logs","logs.heading":"Logs","logs.filter":"filter\u2026","logs.live":"live","logs.refresh":"Refresh","logs.updated":"updated {time}","logs.stale":"no recent activity \xB7 last log {ago}","logs.wrap":"Wrap","logs.settings":"Settings","logs.timezone":"Timezone","logs.tzLocal":"Local","logs.tzUtc":"UTC","logs.copyAll":"Copy all","logs.copied":"Copied","logs.rangeLive":"Live","logs.range1m":"Last 1m","logs.range15m":"Last 15m","logs.range1h":"Last 1h","logs.range6h":"Last 6h","logs.range24h":"Last 24h","logs.rangeCustom":"Custom\u2026","logs.apply":"Apply","logs.from":"From","logs.to":"To","logs.empty":"no log lines yet\u2026","logs.noMatch":"nothing matches the filter","logs.count":"{count} line(s){scope}","logs.scopeSuffix":" \xB7 scope {scope}","logs.refreshFailed":"refresh failed: {message}","metrics.title":"{app} \xB7 {scope} metrics","metrics.heading":"Metrics","metrics.live":"live","metrics.loading":"loading {window}\u2026","metrics.refreshFailed":"refresh failed: {message}","metrics.noData":"no datapoints in this window","metrics.avgMax":"avg {avg} \xB7 max {max}","params.title":"{app} \xB7 parameters","params.heading":"Parameters","params.value":"Value","params.secret":"Secret","params.add":"Add","params.addValue":"Add value","params.editValue":"Edit value","params.parameter":"Parameter","params.allScopes":"All scopes","params.effectiveFor":"Effective values for {scope}","params.ctxApplication":"Application","params.noValues":"No configured values","params.empty":"No parameters yet \u2014 add one to configure this app.","params.readOnly":"read only","params.unset":"unset","params.appliesTo":"Applies to","params.targetApp":"Application","params.targetAppHint":"every scope","params.targetDimension":"By dimension","params.targetScope":"Scope","params.targetScopeHint":"one scope only","params.pickScope":"Pick a scope","params.anyDim":"Any {dim}","params.secretNewOnly":"new parameter only","params.secretPlaceholder":"Enter a new secret value","params.overrides":"Overrides the existing {ctx} value","params.overwriteConfirm":"Overwrite?","params.cancel":"Cancel","params.saveValue":"Save value","params.savingValue":"Saving\u2026","params.applyNote":"Changed values apply on the next deploy.","params.unavailable":"Existing values can't be listed here \u2014 new ones can still be added below.","params.resolveFailed":"Couldn't resolve values: {message}","params.back":"Back","params.deleteParam":"Delete parameter","params.deleteConfirm":"Delete?","params.deleting":"Deleting\u2026","params.deleteReadonly":"Injected by a service link \u2014 delete the link to remove it.","params.notRestored":"This panel's data wasn't restored.","params.refresh":"Refresh","params.refreshing":"Refreshing\u2026","createApp.title":"Create application","createApp.name":"Name","createApp.namespace":"Namespace","createApp.repository":"Repository","createApp.newRepo":"New repository","createApp.importRepo":"Import existing","createApp.template":"Template","createApp.noTemplates":"No templates available","createApp.repoUrl":"Repository URL","createApp.editName":"Customize the repository name","createApp.lockName":"Reset to the generated name","createApp.importUrl":"Existing repository URL","createApp.monorepo":"This repository is a monorepo","createApp.appPath":"Application path inside the repository","createApp.submit":"Create application","createApp.needName":"Name is required.","createApp.needNamespace":"Pick a namespace.","createApp.needTemplate":"Pick a template for the new repository.","createApp.needImportUrl":"Enter the repository URL to import.","createApp.noBaseUrl":"This account has no git provider configured \u2014 use \u201CImport existing\u201D.","createApp.selectNamespaceFirst":"Pick a namespace to generate the repository URL.","createApp.failed":"Failed: {message}","createApp.creatingTitle":"Creating {name}\u2026","createApp.readyTitle":"{name} is ready","createApp.failedTitle":"Couldn't create {name}","createApp.provisioning":"Provisioning\u2026","createApp.readyHint":"Push a commit to trigger the first build, then deploy.","createApp.readyHintNew":"Clone the new repo into a folder, add your code, then push to build and deploy.","createApp.failedHint":"Creation failed \u2014 open the dashboard to see what went wrong.","createApp.openDashboard":"Open in dashboard","findApps.count":"{count} application(s)","findApps.filter":"filter\u2026","findApps.across":"across {ns} namespace(s)","findApps.noMatch":"Nothing matches the filter.","findApps.empty":"No applications here yet.","findApps.loadMore":"Load {more} more","findApps.hint":"Click an application to open its panel.","buildsW.title":"{app} \xB7 {count} build(s)","buildsW.none":"No builds yet \u2014 push a commit so CI produces one.","buildsW.buildTitle":"Build #{id}","buildsW.back":"Builds","buildsW.loadingAssets":"Loading assets\u2026","buildsW.noAssets":"No assets for this build.","buildsW.noAssetsRunning":"No assets yet \u2014 the build is still running.","buildsW.noAssetsFailed":"No assets \u2014 the build failed before producing any.","buildsW.assets":"Assets","buildsW.newRelease":"New release","buildsW.creatingRelease":"Creating release\u2026","buildsW.releaseDone":"Release {semver} created.","buildsW.releasedAs":"Released as {semver}","releasesW.title":"{app} \xB7 {count} release(s)","releasesW.none":"No releases yet.","releasesW.deploy":"Deploy","deploymentsW.title":"{app} \xB7 {count} deployment(s)","deploymentsW.none":"No deployments yet.","deploymentsW.group":"{count} scopes","approvalsW.title":"{app} \xB7 {count} approval(s)","approvalsW.none":"No pending approvals.","approvalsW.approve":"Approve","approvalsW.approving":"Approving\u2026","approvalsW.cancel":"Cancel","approvalsW.cancelling":"Cancelling\u2026","approvalsW.confirmCancel":"Cancel this approval request?","approvalsW.by":"by {who}","overviewW.title":"Org health \xB7 {count} app(s) scanned","overviewW.truncated":"showing the first apps \u2014 narrow with a query for the rest","overviewW.active":"Mid-rollout ({count})","overviewW.noActive":"Nothing deploying right now.","overviewW.trouble":"Needs attention ({count})","overviewW.noTrouble":"No failed or rolled-back scopes.","servicesW.title":"{app} \xB7 {count} dependency(ies)","servicesW.none":"No dependencies attached.","servicesW.catalog":"Available to provision","servicesW.dashboard":"Open in dashboard","servicesW.provisionHint":"Provisioning a dependency is a guided flow \u2014 open the dashboard to add one.","serviceCreateW.pick":"Provision a dependency for {app}","serviceCreateW.name":"Name","serviceCreateW.namePlaceholder":"service name","serviceCreateW.params":"Configuration","serviceCreateW.linkParams":"Link configuration","serviceCreateW.linkTo":"Link to","serviceCreateW.wholeApp":"the whole app (all scopes)","serviceCreateW.costNote":"Provisioning creates real cloud resources (cost-bearing).","serviceCreateW.provision":"Provision","serviceCreateW.provisioning":"Provisioning\u2026","serviceCreateW.creating":"Provisioning {name}\u2026","serviceCreateW.ready":"{name} is ready","serviceCreateW.failed":"Couldn't provision {name}","serviceCreateW.stepRequested":"Service requested","serviceCreateW.stepResources":"Provisioning cloud resources","serviceCreateW.stepLinked":"Linked \u2014 connection parameters on the next deploy","serviceCreateW.paramsNote":"Its connection parameters appear after the next deploy.","serviceCreateW.linkNote":"Once it's active, link it to a scope to wire its connection parameters.","serviceCreateW.dashboard":"Open in dashboard","serviceCreateW.failedHint":"Open the dashboard to see what went wrong.","serviceLinkW.pick":"Link a service to {app}","serviceLinkW.service":"Service","serviceLinkW.note":"A credential link (e.g. a database user) provisions resources.","serviceLinkW.link":"Link","serviceLinkW.linking":"Linking\u2026","serviceLinkW.creating":"Linking {service}\u2026","serviceLinkW.ready":"{service} is linked","serviceLinkW.failed":"Couldn't link {service}","serviceLinkW.stepRequested":"Link requested","serviceLinkW.stepProvisioning":"Wiring the connection","serviceLinkW.paramsNote":"Its connection parameters reach the runtime on the next deploy.","serviceActionW.pickTarget":"Run an action in {app}","serviceActionW.pickAction":"Which action on {name}?","serviceActionW.params":"Parameters","serviceActionW.note":"A custom action runs an operation the platform team defined.","serviceActionW.run":"Run","serviceActionW.running":"Running\u2026","serviceActionW.runningTitle":"Running {action}\u2026","serviceActionW.ran":"{action} ran","serviceActionW.failed":"{action} failed","serviceActionW.stepRequested":"Action requested","serviceActionW.stepRunning":"Running","serviceActionW.runningNote":"The action runs asynchronously; its result appears when it finishes.","serviceActionW.failedHint":"Open the dashboard to see what went wrong.","serviceDeleteW.pickTarget":"Delete in {app}","serviceDeleteW.warning":"This destroys the resource and its data. It can't be undone.","serviceDeleteW.delete":"Delete","serviceDeleteW.deleting":"Deleting\u2026","serviceDeleteW.confirm":"Delete it?","serviceDeleteW.stepRequested":"Delete requested","serviceDeleteW.stepRemoving":"Removing","serviceDeleteW.removed":"{name} was deleted","serviceDeleteW.deprovisioning":"Deleting {name}\u2026","serviceDeleteW.removedNote":"The record and its resources are gone.","serviceDeleteW.deprovisioningNote":"An agent is deprovisioning its resources; the record goes once it finishes."},j_={"confirm.yes":"S\xED, hacelo","confirm.no":"Cancelar","chooser.pick":"eleg\xED un scope:","term.empty":"sin salida todav\xEDa\u2026","term.loading":"buscando logs\u2026","term.copyLine":"copiar l\xEDnea",hint:"Siguiente:",loadMore:"Cargar m\xE1s","panel.scopes":"Scopes","panel.releases":"Releases","panel.latestBuild":"\xDAltimo build","panel.noScopes":"Sin scopes todav\xEDa \u2014 cre\xE1 uno para tener d\xF3nde deployar.","panel.scopePlaceholder":"nombre del scope, p. ej. dev","panel.typePlaceholder":"tipo\u2026","panel.pickScope":"Eleg\xED un scope","panel.createScope":"Crear scope","panel.ship":"publicar","panel.live":"en vivo","panel.openRollout":"Abrir rollout","panel.nothingDeployed":"nada deployado","panel.noReleases":"ninguna todav\xEDa","panel.noBuild":"ninguno \u2014 pushe\xE1 un commit para que CI compile","panel.deployLatest":"Deployar lo \xFAltimo","panel.logs":"Logs","panel.metrics":"M\xE9tricas","panel.pickType":"Eleg\xED un tipo de scope y cre\xE1 de nuevo.","panel.waitingData":"esperando datos\u2026","panel.backToList":"apps","rollout.deployingTo":"Deployando a {scope}","rollout.release":"release","rollout.backToApp":"app","rollout.trafficLabel":"Tr\xE1fico en la versi\xF3n nueva","rollout.live":"{pct}% en vivo","rollout.movingTo":"yendo a {pct}%","rollout.move":"Mover tr\xE1fico","rollout.finalize":"Finalizar","rollout.rollback":"Revertir","rollout.confirmFinalize":"\xBFFinalizar y retirar la versi\xF3n anterior?","rollout.confirmRollback":"\xBFDevolver TODO el tr\xE1fico a la versi\xF3n anterior?","rollout.log":"Log del deployment","rollout.waiting":"esperando actividad\u2026","rollout.failed":"Fall\xF3: {message}","rollout.deployment":"Deployment #{id}","rollout.busyMove":"Moviendo tr\xE1fico\u2026","rollout.busyFinalize":"Finalizando\u2026","rollout.busyRollback":"Revirtiendo\u2026","rollout.autoDone":"Listo \u2014 la release est\xE1 completamente en vivo.","rollout.autoRolledBack":"Revertido \u2014 la versi\xF3n anterior est\xE1 sirviendo tr\xE1fico.","rollout.autoFailed":"El deployment fall\xF3 \u2014 la versi\xF3n anterior sigue sirviendo.","rollout.autoWaiting":"Esperando instancias \u2014 los controles se habilitan cuando el rollout est\xE1 corriendo.","rollout.autoFull":"Todo el tr\xE1fico en la versi\xF3n nueva \u2014 finaliz\xE1 para retirar la anterior.","rollout.autoLabel":"Auto-avance","rollout.autoOff":"off","rollout.trafficHelp":"Arrastr\xE1 para mover el tr\xE1fico ahora; el auto-avance sube hasta 100%.","rollout.appLogs":"Logs de la aplicaci\xF3n","rollout.appLogsEmpty":"sin logs de la aplicaci\xF3n todav\xEDa\u2026","logs.title":"{app} \xB7 logs","logs.heading":"Logs","logs.filter":"filtrar\u2026","logs.live":"vivo","logs.refresh":"Refrescar","logs.updated":"actualizado {time}","logs.stale":"sin actividad reciente \xB7 \xFAltimo log {ago}","logs.wrap":"Ajustar","logs.settings":"Ajustes","logs.timezone":"Zona horaria","logs.tzLocal":"Local","logs.tzUtc":"UTC","logs.copyAll":"Copiar todo","logs.copied":"Copiado","logs.rangeLive":"En vivo","logs.range1m":"\xDAltimos 1m","logs.range15m":"\xDAltimos 15m","logs.range1h":"\xDAltima 1h","logs.range6h":"\xDAltimas 6h","logs.range24h":"\xDAltimas 24h","logs.rangeCustom":"Personalizado\u2026","logs.apply":"Aplicar","logs.from":"Desde","logs.to":"Hasta","logs.empty":"sin l\xEDneas de log todav\xEDa\u2026","logs.noMatch":"nada coincide con el filtro","logs.count":"{count} l\xEDnea(s){scope}","logs.scopeSuffix":" \xB7 scope {scope}","logs.refreshFailed":"fall\xF3 el refresh: {message}","metrics.title":"{app} \xB7 m\xE9tricas de {scope}","metrics.heading":"M\xE9tricas","metrics.live":"vivo","metrics.loading":"cargando {window}\u2026","metrics.refreshFailed":"fall\xF3 el refresh: {message}","metrics.noData":"sin datapoints en esta ventana","metrics.avgMax":"prom {avg} \xB7 m\xE1x {max}","params.title":"{app} \xB7 par\xE1metros","params.heading":"Par\xE1metros","params.value":"Valor","params.secret":"Secreto","params.add":"Agregar","params.addValue":"Agregar valor","params.editValue":"Editar valor","params.parameter":"Par\xE1metro","params.allScopes":"Todos los scopes","params.effectiveFor":"Valores efectivos para {scope}","params.ctxApplication":"Aplicaci\xF3n","params.noValues":"Sin valores configurados","params.empty":"Todav\xEDa no hay par\xE1metros \u2014 agreg\xE1 uno para configurar esta app.","params.readOnly":"solo lectura","params.unset":"sin valor","params.appliesTo":"Aplica a","params.targetApp":"Aplicaci\xF3n","params.targetAppHint":"todos los scopes","params.targetDimension":"Por dimensi\xF3n","params.targetScope":"Scope","params.targetScopeHint":"un solo scope","params.pickScope":"Eleg\xED un scope","params.anyDim":"Cualquier {dim}","params.secretNewOnly":"solo par\xE1metro nuevo","params.secretPlaceholder":"Ingres\xE1 un nuevo valor secreto","params.overrides":"Sobrescribe el valor existente de {ctx}","params.overwriteConfirm":"\xBFSobrescribir?","params.cancel":"Cancelar","params.saveValue":"Guardar valor","params.savingValue":"Guardando\u2026","params.applyNote":"Los valores cambiados aplican en el pr\xF3ximo deploy.","params.unavailable":"Los valores existentes no se pueden listar ac\xE1 \u2014 igual pod\xE9s agregar nuevos abajo.","params.resolveFailed":"No pude resolver los valores: {message}","params.back":"Volver","params.deleteParam":"Eliminar par\xE1metro","params.deleteConfirm":"\xBFEliminar?","params.deleting":"Eliminando\u2026","params.deleteReadonly":"Inyectado por un link de servicio \u2014 elimin\xE1 el link para quitarlo.","params.notRestored":"Los datos de este panel no se restauraron.","params.refresh":"Actualizar","params.refreshing":"Actualizando\u2026","createApp.title":"Crear aplicaci\xF3n","createApp.name":"Nombre","createApp.namespace":"Namespace","createApp.repository":"Repositorio","createApp.newRepo":"Nuevo repositorio","createApp.importRepo":"Importar existente","createApp.template":"Template","createApp.noTemplates":"Sin templates disponibles","createApp.repoUrl":"URL del repositorio","createApp.editName":"Personalizar el nombre del repositorio","createApp.lockName":"Volver al nombre generado","createApp.importUrl":"URL del repositorio existente","createApp.monorepo":"Este repositorio es un monorepo","createApp.appPath":"Ruta de la aplicaci\xF3n dentro del repositorio","createApp.submit":"Crear aplicaci\xF3n","createApp.needName":"El nombre es obligatorio.","createApp.needNamespace":"Eleg\xED un namespace.","createApp.needTemplate":"Eleg\xED un template para el nuevo repositorio.","createApp.needImportUrl":"Ingres\xE1 la URL del repositorio a importar.","createApp.noBaseUrl":"Esta cuenta no tiene proveedor de git configurado \u2014 us\xE1 \u201CImportar existente\u201D.","createApp.selectNamespaceFirst":"Eleg\xED un namespace para generar la URL del repositorio.","createApp.failed":"Fall\xF3: {message}","createApp.creatingTitle":"Creando {name}\u2026","createApp.readyTitle":"{name} est\xE1 lista","createApp.failedTitle":"No se pudo crear {name}","createApp.provisioning":"Aprovisionando\u2026","createApp.readyHint":"Pushe\xE1 un commit para disparar el primer build y despu\xE9s deploy\xE1.","createApp.readyHintNew":"Clon\xE1 el repo nuevo en una carpeta, agreg\xE1 tu c\xF3digo y pushe\xE1 para buildear y deployar.","createApp.failedHint":"La creaci\xF3n fall\xF3 \u2014 abr\xED el dashboard para ver qu\xE9 pas\xF3.","createApp.openDashboard":"Abrir en el dashboard","findApps.count":"{count} aplicaci\xF3n(es)","findApps.filter":"filtrar\u2026","findApps.across":"en {ns} namespace(s)","findApps.noMatch":"Nada coincide con el filtro.","findApps.empty":"Todav\xEDa no hay aplicaciones.","findApps.loadMore":"Cargar {more} m\xE1s","findApps.hint":"Hac\xE9 clic en una aplicaci\xF3n para abrir su panel.","buildsW.title":"{app} \xB7 {count} build(s)","buildsW.none":"Todav\xEDa no hay builds \u2014 pushe\xE1 un commit para que CI genere uno.","buildsW.buildTitle":"Build #{id}","buildsW.back":"Builds","buildsW.loadingAssets":"Cargando assets\u2026","buildsW.noAssets":"Sin assets para este build.","buildsW.noAssetsRunning":"Todav\xEDa sin assets \u2014 el build sigue corriendo.","buildsW.noAssetsFailed":"Sin assets \u2014 el build fall\xF3 antes de producir alguno.","buildsW.assets":"Assets","buildsW.newRelease":"Nuevo release","buildsW.creatingRelease":"Creando release\u2026","buildsW.releaseDone":"Release {semver} creado.","buildsW.releasedAs":"Publicado como {semver}","releasesW.title":"{app} \xB7 {count} release(s)","releasesW.none":"Todav\xEDa no hay releases.","releasesW.deploy":"Deployar","deploymentsW.title":"{app} \xB7 {count} deployment(s)","deploymentsW.none":"Todav\xEDa no hay deployments.","deploymentsW.group":"{count} scopes","approvalsW.title":"{app} \xB7 {count} aprobaci\xF3n(es)","approvalsW.none":"No hay aprobaciones pendientes.","approvalsW.approve":"Aprobar","approvalsW.approving":"Aprobando\u2026","approvalsW.cancel":"Cancelar","approvalsW.cancelling":"Cancelando\u2026","approvalsW.confirmCancel":"\xBFCancelar esta solicitud de aprobaci\xF3n?","approvalsW.by":"por {who}","overviewW.title":"Salud del org \xB7 {count} app(s) escaneadas","overviewW.truncated":"mostrando las primeras apps \u2014 filtr\xE1 con una b\xFAsqueda para el resto","overviewW.active":"En despliegue ({count})","overviewW.noActive":"Nada despleg\xE1ndose ahora.","overviewW.trouble":"Requiere atenci\xF3n ({count})","overviewW.noTrouble":"Ning\xFAn scope fall\xF3 ni se revirti\xF3.","servicesW.title":"{app} \xB7 {count} dependencia(s)","servicesW.none":"No hay dependencias adjuntas.","servicesW.catalog":"Disponibles para aprovisionar","servicesW.dashboard":"Abrir en el dashboard","servicesW.provisionHint":"Aprovisionar una dependencia es un flujo guiado \u2014 abr\xED el dashboard para agregar una.","serviceCreateW.pick":"Provisionar una dependencia para {app}","serviceCreateW.name":"Nombre","serviceCreateW.namePlaceholder":"nombre del servicio","serviceCreateW.params":"Configuraci\xF3n","serviceCreateW.linkParams":"Configuraci\xF3n del link","serviceCreateW.linkTo":"Linkear a","serviceCreateW.wholeApp":"toda la app (todos los scopes)","serviceCreateW.costNote":"Provisionar crea recursos cloud reales (tiene costo).","serviceCreateW.provision":"Provisionar","serviceCreateW.provisioning":"Provisionando\u2026","serviceCreateW.creating":"Provisionando {name}\u2026","serviceCreateW.ready":"{name} est\xE1 listo","serviceCreateW.failed":"No se pudo provisionar {name}","serviceCreateW.stepRequested":"Servicio solicitado","serviceCreateW.stepResources":"Provisionando recursos cloud","serviceCreateW.stepLinked":"Linkeado \u2014 par\xE1metros de conexi\xF3n en el pr\xF3ximo deploy","serviceCreateW.paramsNote":"Sus par\xE1metros de conexi\xF3n aparecen despu\xE9s del pr\xF3ximo deploy.","serviceCreateW.linkNote":"Una vez activo, linkealo a un scope para conectar sus par\xE1metros.","serviceCreateW.dashboard":"Abrir en el dashboard","serviceCreateW.failedHint":"Abr\xED el dashboard para ver qu\xE9 pas\xF3.","serviceLinkW.pick":"Linkear un servicio a {app}","serviceLinkW.service":"Servicio","serviceLinkW.note":"Un link de credenciales (p. ej. un usuario de base de datos) provisiona recursos.","serviceLinkW.link":"Linkear","serviceLinkW.linking":"Linkeando\u2026","serviceLinkW.creating":"Linkeando {service}\u2026","serviceLinkW.ready":"{service} est\xE1 linkeado","serviceLinkW.failed":"No se pudo linkear {service}","serviceLinkW.stepRequested":"Link solicitado","serviceLinkW.stepProvisioning":"Conectando","serviceLinkW.paramsNote":"Sus par\xE1metros de conexi\xF3n llegan al runtime en el pr\xF3ximo deploy.","serviceActionW.pickTarget":"Correr una acci\xF3n en {app}","serviceActionW.pickAction":"\xBFQu\xE9 acci\xF3n en {name}?","serviceActionW.params":"Par\xE1metros","serviceActionW.note":"Una custom action corre una operaci\xF3n definida por el equipo de plataforma.","serviceActionW.run":"Correr","serviceActionW.running":"Corriendo\u2026","serviceActionW.runningTitle":"Corriendo {action}\u2026","serviceActionW.ran":"{action} corri\xF3","serviceActionW.failed":"{action} fall\xF3","serviceActionW.stepRequested":"Acci\xF3n solicitada","serviceActionW.stepRunning":"Corriendo","serviceActionW.runningNote":"La acci\xF3n corre de forma as\xEDncrona; su resultado aparece cuando termina.","serviceActionW.failedHint":"Abr\xED el dashboard para ver qu\xE9 pas\xF3.","serviceDeleteW.pickTarget":"Borrar en {app}","serviceDeleteW.warning":"Esto destruye el recurso y sus datos. No se puede deshacer.","serviceDeleteW.delete":"Borrar","serviceDeleteW.deleting":"Borrando\u2026","serviceDeleteW.confirm":"\xBFBorrarlo?","serviceDeleteW.stepRequested":"Borrado solicitado","serviceDeleteW.stepRemoving":"Eliminando","serviceDeleteW.removed":"{name} fue borrado","serviceDeleteW.deprovisioning":"Borrando {name}\u2026","serviceDeleteW.removedNote":"El registro y sus recursos ya no est\xE1n.","serviceDeleteW.deprovisioningNote":"Un agente est\xE1 desaprovisionando sus recursos; el registro se va cuando termina."},R_={"confirm.yes":"Sim, fa\xE7a","confirm.no":"Cancelar","chooser.pick":"escolha um scope:","term.empty":"sem sa\xEDda ainda\u2026","term.loading":"buscando logs\u2026","term.copyLine":"copiar linha",hint:"Pr\xF3ximo:",loadMore:"Carregar mais","panel.scopes":"Scopes","panel.releases":"Releases","panel.latestBuild":"\xDAltimo build","panel.noScopes":"Ainda sem scopes \u2014 crie um para ter onde fazer deploy.","panel.scopePlaceholder":"nome do scope, ex. dev","panel.typePlaceholder":"tipo\u2026","panel.pickScope":"Escolha um scope","panel.createScope":"Criar scope","panel.ship":"publicar","panel.live":"no ar","panel.openRollout":"Abrir rollout","panel.nothingDeployed":"nada em deploy","panel.noReleases":"nenhuma ainda","panel.noBuild":"nenhum \u2014 fa\xE7a push de um commit para o CI buildar","panel.deployLatest":"Deploy do \xFAltimo","panel.logs":"Logs","panel.metrics":"M\xE9tricas","panel.pickType":"Escolha um tipo de scope e crie de novo.","panel.waitingData":"aguardando dados\u2026","panel.backToList":"apps","rollout.deployingTo":"Fazendo deploy em {scope}","rollout.release":"release","rollout.backToApp":"app","rollout.trafficLabel":"Tr\xE1fego na nova vers\xE3o","rollout.live":"{pct}% no ar","rollout.movingTo":"indo para {pct}%","rollout.move":"Mover tr\xE1fego","rollout.finalize":"Finalizar","rollout.rollback":"Reverter","rollout.confirmFinalize":"Finalizar e aposentar a vers\xE3o antiga?","rollout.confirmRollback":"Devolver TODO o tr\xE1fego para a vers\xE3o anterior?","rollout.log":"Log do deployment","rollout.waiting":"aguardando atividade\u2026","rollout.failed":"Falhou: {message}","rollout.deployment":"Deployment #{id}","rollout.busyMove":"Movendo tr\xE1fego\u2026","rollout.busyFinalize":"Finalizando\u2026","rollout.busyRollback":"Revertendo\u2026","rollout.autoDone":"Pronto \u2014 a release est\xE1 totalmente no ar.","rollout.autoRolledBack":"Revertido \u2014 a vers\xE3o anterior est\xE1 atendendo o tr\xE1fego.","rollout.autoFailed":"O deployment falhou \u2014 a vers\xE3o anterior continua atendendo.","rollout.autoWaiting":"Aguardando inst\xE2ncias \u2014 os controles liberam quando o rollout estiver em execu\xE7\xE3o.","rollout.autoFull":"Todo o tr\xE1fego na nova vers\xE3o \u2014 finalize para aposentar a antiga.","rollout.autoLabel":"Avan\xE7o autom\xE1tico","rollout.autoOff":"desligado","rollout.trafficHelp":"Arraste para mover o tr\xE1fego agora; o avan\xE7o autom\xE1tico leva a 100%.","rollout.appLogs":"Logs da aplica\xE7\xE3o","rollout.appLogsEmpty":"ainda sem logs da aplica\xE7\xE3o\u2026","logs.title":"{app} \xB7 logs","logs.heading":"Logs","logs.filter":"filtrar\u2026","logs.live":"ao vivo","logs.refresh":"Atualizar","logs.updated":"atualizado {time}","logs.stale":"sem atividade recente \xB7 \xFAltimo log {ago}","logs.wrap":"Quebrar linha","logs.settings":"Configura\xE7\xF5es","logs.timezone":"Fuso hor\xE1rio","logs.tzLocal":"Local","logs.tzUtc":"UTC","logs.copyAll":"Copiar tudo","logs.copied":"Copiado","logs.rangeLive":"Ao vivo","logs.range1m":"\xDAltimos 1m","logs.range15m":"\xDAltimos 15m","logs.range1h":"\xDAltima 1h","logs.range6h":"\xDAltimas 6h","logs.range24h":"\xDAltimas 24h","logs.rangeCustom":"Personalizado\u2026","logs.apply":"Aplicar","logs.from":"De","logs.to":"At\xE9","logs.empty":"ainda sem linhas de log\u2026","logs.noMatch":"nada corresponde ao filtro","logs.count":"{count} linha(s){scope}","logs.scopeSuffix":" \xB7 scope {scope}","logs.refreshFailed":"atualiza\xE7\xE3o falhou: {message}","metrics.title":"{app} \xB7 m\xE9tricas de {scope}","metrics.heading":"M\xE9tricas","metrics.live":"ao vivo","metrics.loading":"carregando {window}\u2026","metrics.refreshFailed":"atualiza\xE7\xE3o falhou: {message}","metrics.noData":"sem datapoints nesta janela","metrics.avgMax":"m\xE9d {avg} \xB7 m\xE1x {max}","params.title":"{app} \xB7 par\xE2metros","params.heading":"Par\xE2metros","params.value":"Valor","params.secret":"Secret","params.add":"Adicionar","params.addValue":"Adicionar valor","params.editValue":"Editar valor","params.parameter":"Par\xE2metro","params.allScopes":"Todos os scopes","params.effectiveFor":"Valores efetivos para {scope}","params.ctxApplication":"Aplica\xE7\xE3o","params.noValues":"Nenhum valor configurado","params.empty":"Ainda sem par\xE2metros \u2014 adicione um para configurar esta app.","params.readOnly":"somente leitura","params.unset":"n\xE3o definido","params.appliesTo":"Aplica-se a","params.targetApp":"Aplica\xE7\xE3o","params.targetAppHint":"todos os scopes","params.targetDimension":"Por dimens\xE3o","params.targetScope":"Scope","params.targetScopeHint":"apenas um scope","params.pickScope":"Escolha um scope","params.anyDim":"Qualquer {dim}","params.secretNewOnly":"apenas par\xE2metro novo","params.secretPlaceholder":"Insira um novo valor secreto","params.overrides":"Sobrescreve o valor existente de {ctx}","params.overwriteConfirm":"Sobrescrever?","params.cancel":"Cancelar","params.saveValue":"Salvar valor","params.savingValue":"Salvando\u2026","params.applyNote":"Valores alterados aplicam no pr\xF3ximo deploy.","params.unavailable":"Os valores existentes n\xE3o podem ser listados aqui \u2014 novos ainda podem ser adicionados abaixo.","params.resolveFailed":"N\xE3o foi poss\xEDvel resolver os valores: {message}","params.back":"Voltar","params.deleteParam":"Excluir par\xE2metro","params.deleteConfirm":"Excluir?","params.deleting":"Excluindo\u2026","params.deleteReadonly":"Injetado por um link de servi\xE7o \u2014 exclua o link para remov\xEA-lo.","params.notRestored":"Os dados deste painel n\xE3o foram restaurados.","params.refresh":"Atualizar","params.refreshing":"Atualizando\u2026","createApp.title":"Criar aplica\xE7\xE3o","createApp.name":"Nome","createApp.namespace":"Namespace","createApp.repository":"Reposit\xF3rio","createApp.newRepo":"Novo reposit\xF3rio","createApp.importRepo":"Importar existente","createApp.template":"Template","createApp.noTemplates":"Nenhum template dispon\xEDvel","createApp.repoUrl":"URL do reposit\xF3rio","createApp.editName":"Personalizar o nome do reposit\xF3rio","createApp.lockName":"Voltar ao nome gerado","createApp.importUrl":"URL do reposit\xF3rio existente","createApp.monorepo":"Este reposit\xF3rio \xE9 um monorepo","createApp.appPath":"Caminho da aplica\xE7\xE3o dentro do reposit\xF3rio","createApp.submit":"Criar aplica\xE7\xE3o","createApp.needName":"O nome \xE9 obrigat\xF3rio.","createApp.needNamespace":"Escolha um namespace.","createApp.needTemplate":"Escolha um template para o novo reposit\xF3rio.","createApp.needImportUrl":"Informe a URL do reposit\xF3rio para importar.","createApp.noBaseUrl":"Esta conta n\xE3o tem provedor git configurado \u2014 use \u201CImportar existente\u201D.","createApp.selectNamespaceFirst":"Escolha um namespace para gerar a URL do reposit\xF3rio.","createApp.failed":"Falhou: {message}","createApp.creatingTitle":"Criando {name}\u2026","createApp.readyTitle":"{name} est\xE1 pronta","createApp.failedTitle":"N\xE3o foi poss\xEDvel criar {name}","createApp.provisioning":"Provisionando\u2026","createApp.readyHint":"Fa\xE7a push de um commit para disparar o primeiro build, depois deploy.","createApp.readyHintNew":"Clone o repo novo em uma pasta, adicione seu c\xF3digo e fa\xE7a push para buildar e deployar.","createApp.failedHint":"A cria\xE7\xE3o falhou \u2014 abra o dashboard para ver o que deu errado.","createApp.openDashboard":"Abrir no dashboard","findApps.count":"{count} aplica\xE7\xE3o(\xF5es)","findApps.filter":"filtrar\u2026","findApps.across":"em {ns} namespace(s)","findApps.noMatch":"Nada corresponde ao filtro.","findApps.empty":"Ainda n\xE3o h\xE1 aplica\xE7\xF5es.","findApps.loadMore":"Carregar mais {more}","findApps.hint":"Clique em uma aplica\xE7\xE3o para abrir seu painel.","buildsW.title":"{app} \xB7 {count} build(s)","buildsW.none":"Ainda sem builds \u2014 fa\xE7a push de um commit para o CI gerar um.","buildsW.buildTitle":"Build #{id}","buildsW.back":"Builds","buildsW.loadingAssets":"Carregando assets\u2026","buildsW.noAssets":"Nenhum asset para este build.","buildsW.noAssetsRunning":"Ainda sem assets \u2014 o build ainda est\xE1 rodando.","buildsW.noAssetsFailed":"Nenhum asset \u2014 o build falhou antes de produzir algum.","buildsW.assets":"Assets","buildsW.newRelease":"Nova release","buildsW.creatingRelease":"Criando release\u2026","buildsW.releaseDone":"Release {semver} criada.","buildsW.releasedAs":"Com release {semver}","releasesW.title":"{app} \xB7 {count} release(s)","releasesW.none":"Ainda sem releases.","releasesW.deploy":"Deploy","deploymentsW.title":"{app} \xB7 {count} deployment(s)","deploymentsW.none":"Ainda sem deployments.","deploymentsW.group":"{count} scopes","approvalsW.title":"{app} \xB7 {count} aprova\xE7\xE3o(\xF5es)","approvalsW.none":"Nenhuma aprova\xE7\xE3o pendente.","approvalsW.approve":"Aprovar","approvalsW.approving":"Aprovando\u2026","approvalsW.cancel":"Cancelar","approvalsW.cancelling":"Cancelando\u2026","approvalsW.confirmCancel":"Cancelar esta solicita\xE7\xE3o de aprova\xE7\xE3o?","approvalsW.by":"por {who}","overviewW.title":"Sa\xFAde da org \xB7 {count} app(s) escaneada(s)","overviewW.truncated":"mostrando as primeiras apps \u2014 refine com uma query para o resto","overviewW.active":"Em rollout ({count})","overviewW.noActive":"Nada em deploy no momento.","overviewW.trouble":"Precisa de aten\xE7\xE3o ({count})","overviewW.noTrouble":"Nenhum scope com falha ou revertido.","servicesW.title":"{app} \xB7 {count} depend\xEAncia(s)","servicesW.none":"Nenhuma depend\xEAncia anexada.","servicesW.catalog":"Dispon\xEDveis para provisionar","servicesW.dashboard":"Abrir no dashboard","servicesW.provisionHint":"Provisionar uma depend\xEAncia \xE9 um fluxo guiado \u2014 abra o dashboard para adicionar uma.","serviceCreateW.pick":"Provisionar uma depend\xEAncia para {app}","serviceCreateW.name":"Nome","serviceCreateW.namePlaceholder":"nome do servi\xE7o","serviceCreateW.params":"Configura\xE7\xE3o","serviceCreateW.linkParams":"Configura\xE7\xE3o do link","serviceCreateW.linkTo":"Linkar a","serviceCreateW.wholeApp":"a app inteira (todos os scopes)","serviceCreateW.costNote":"Provisionar cria recursos cloud reais (com custo).","serviceCreateW.provision":"Provisionar","serviceCreateW.provisioning":"Provisionando\u2026","serviceCreateW.creating":"Provisionando {name}\u2026","serviceCreateW.ready":"{name} est\xE1 pronto","serviceCreateW.failed":"N\xE3o foi poss\xEDvel provisionar {name}","serviceCreateW.stepRequested":"Servi\xE7o solicitado","serviceCreateW.stepResources":"Provisionando recursos cloud","serviceCreateW.stepLinked":"Linkado \u2014 par\xE2metros de conex\xE3o no pr\xF3ximo deploy","serviceCreateW.paramsNote":"Seus par\xE2metros de conex\xE3o aparecem ap\xF3s o pr\xF3ximo deploy.","serviceCreateW.linkNote":"Quando estiver ativo, linke-o a um scope para conectar seus par\xE2metros de conex\xE3o.","serviceCreateW.dashboard":"Abrir no dashboard","serviceCreateW.failedHint":"Abra o dashboard para ver o que deu errado.","serviceLinkW.pick":"Linkar um servi\xE7o a {app}","serviceLinkW.service":"Servi\xE7o","serviceLinkW.note":"Um link de credenciais (ex. um usu\xE1rio de banco de dados) provisiona recursos.","serviceLinkW.link":"Linkar","serviceLinkW.linking":"Linkando\u2026","serviceLinkW.creating":"Linkando {service}\u2026","serviceLinkW.ready":"{service} est\xE1 linkado","serviceLinkW.failed":"N\xE3o foi poss\xEDvel linkar {service}","serviceLinkW.stepRequested":"Link solicitado","serviceLinkW.stepProvisioning":"Conectando","serviceLinkW.paramsNote":"Seus par\xE2metros de conex\xE3o chegam ao runtime no pr\xF3ximo deploy.","serviceActionW.pickTarget":"Rodar uma a\xE7\xE3o em {app}","serviceActionW.pickAction":"Qual a\xE7\xE3o em {name}?","serviceActionW.params":"Par\xE2metros","serviceActionW.note":"Uma custom action roda uma opera\xE7\xE3o definida pelo time de plataforma.","serviceActionW.run":"Rodar","serviceActionW.running":"Rodando\u2026","serviceActionW.runningTitle":"Rodando {action}\u2026","serviceActionW.ran":"{action} rodou","serviceActionW.failed":"{action} falhou","serviceActionW.stepRequested":"A\xE7\xE3o solicitada","serviceActionW.stepRunning":"Rodando","serviceActionW.runningNote":"A a\xE7\xE3o roda de forma ass\xEDncrona; seu resultado aparece quando termina.","serviceActionW.failedHint":"Abra o dashboard para ver o que deu errado.","serviceDeleteW.pickTarget":"Deletar em {app}","serviceDeleteW.warning":"Isso destr\xF3i o recurso e seus dados. N\xE3o pode ser desfeito.","serviceDeleteW.delete":"Deletar","serviceDeleteW.deleting":"Deletando\u2026","serviceDeleteW.confirm":"Deletar?","serviceDeleteW.stepRequested":"Dele\xE7\xE3o solicitada","serviceDeleteW.stepRemoving":"Removendo","serviceDeleteW.removed":"{name} foi deletado","serviceDeleteW.deprovisioning":"Deletando {name}\u2026","serviceDeleteW.removedNote":"O registro e seus recursos j\xE1 n\xE3o existem.","serviceDeleteW.deprovisioningNote":"Um agente est\xE1 desprovisionando seus recursos; o registro sai quando termina."},O_={en:T_,es:j_,pt:R_};function Jm(e){let r=e?.structuredContent?._locale;return r==="es"||r==="pt"?r:"en"}function Km(e){let r=O_[e];return(n,i)=>r[n].replace(/\{(\w+)\}/g,(t,o)=>i?.[o]!==void 0?String(i[o]):t)}var Gm=Gr(Km("en")),Qm=Gm.Provider,Ym=()=>fi(Gm),Xm=e=>Km(e);function ef(e){return{render:function(r){gu(r,e)},unmount:function(){vu(e)}}}function tf(e){let r=document.getElementById("root");r&&ef(r).render(e)}var A_=0;function h(e,r,n,i,t,o){r||(r={});var a,s,u=r;if("ref"in u)for(s in u={},r)s=="ref"?a=r[s]:u[s]=r[s];var p={type:e,props:u,key:n,ref:a,__k:null,__:null,__b:0,__e:null,__c:null,constructor:void 0,__v:--A_,__i:-1,__u:0,__source:t,__self:o};if(typeof e=="function"&&(a=e.defaultProps))for(s in a)u[s]===void 0&&(u[s]=a[s]);return O.vnode&&O.vnode(p),p}var D_={clock:{body:h(M,{children:[h("circle",{cx:"12",cy:"12",r:"10"}),h("polyline",{points:"12 6 12 12 16 14"})]})},play:{fill:!0,body:h("polygon",{points:"6 3 20 12 6 21 6 3"})},pause:{fill:!0,body:h(M,{children:[h("rect",{x:"6",y:"4",width:"4",height:"16",rx:"1"}),h("rect",{x:"14",y:"4",width:"4",height:"16",rx:"1"})]})},refresh:{body:h(M,{children:[h("path",{d:"M21 12a9 9 0 1 1-2.64-6.36"}),h("polyline",{points:"21 3 21 8 16 8"})]})},rocket:{body:h(M,{children:[h("path",{d:"M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z"}),h("path",{d:"m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z"}),h("path",{d:"M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0"}),h("path",{d:"M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5"})]})},logs:{body:h(M,{children:[h("path",{d:"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z"}),h("polyline",{points:"14 2 14 8 20 8"}),h("line",{x1:"16",y1:"13",x2:"8",y2:"13"}),h("line",{x1:"16",y1:"17",x2:"8",y2:"17"}),h("line",{x1:"10",y1:"9",x2:"8",y2:"9"})]})},metrics:{body:h(M,{children:[h("polyline",{points:"22 7 13.5 15.5 8.5 10.5 2 17"}),h("polyline",{points:"16 7 22 7 22 13"})]})},lock:{body:h(M,{children:[h("rect",{x:"3",y:"11",width:"18",height:"11",rx:"2",ry:"2"}),h("path",{d:"M7 11V7a5 5 0 0 1 10 0v4"})]})},edit:{body:h("path",{d:"M17 3a2.828 2.828 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5L17 3z"})},copy:{body:h(M,{children:[h("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),h("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]})},check:{body:h("polyline",{points:"20 6 9 17 4 12"})},package:{body:h(M,{children:[h("path",{d:"M21 8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16Z"}),h("path",{d:"m3.3 7 8.7 5 8.7-5"}),h("path",{d:"M12 22V12"})]})},x:{body:h(M,{children:[h("line",{x1:"18",y1:"6",x2:"6",y2:"18"}),h("line",{x1:"6",y1:"6",x2:"18",y2:"18"})]})},plus:{body:h(M,{children:[h("line",{x1:"12",y1:"5",x2:"12",y2:"19"}),h("line",{x1:"5",y1:"12",x2:"19",y2:"12"})]})},chevronDown:{body:h("polyline",{points:"6 9 12 15 18 9"})},chevronLeft:{body:h("polyline",{points:"15 18 9 12 15 6"})},chevronRight:{body:h("polyline",{points:"9 18 15 12 9 6"})},arrowLeft:{body:h(M,{children:[h("line",{x1:"19",y1:"12",x2:"5",y2:"12"}),h("polyline",{points:"12 19 5 12 12 5"})]})},sliders:{body:h(M,{children:[h("line",{x1:"21",y1:"4",x2:"14",y2:"4"}),h("line",{x1:"10",y1:"4",x2:"3",y2:"4"}),h("line",{x1:"21",y1:"12",x2:"12",y2:"12"}),h("line",{x1:"8",y1:"12",x2:"3",y2:"12"}),h("line",{x1:"21",y1:"20",x2:"16",y2:"20"}),h("line",{x1:"12",y1:"20",x2:"3",y2:"20"}),h("line",{x1:"14",y1:"2",x2:"14",y2:"6"}),h("line",{x1:"8",y1:"10",x2:"8",y2:"14"}),h("line",{x1:"16",y1:"18",x2:"16",y2:"22"})]})}},Il=({name:e,size:r=14,className:n})=>{let i=D_[e];return h("svg",{className:["icon",n].filter(Boolean).join(" "),width:r,height:r,viewBox:"0 0 24 24",fill:i.fill?"currentColor":"none",stroke:i.fill?"none":"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round","aria-hidden":"true",focusable:"false",children:i.body})};var Pl=({children:e})=>h("div",{className:"card",children:e}),Nl=({children:e})=>h("div",{className:"row",children:e});var rf=({tone:e,children:r})=>h("div",{className:`note${e?` ${e}`:""}`,children:r});var ti=({variant:e,on:r,className:n,...i})=>h("button",{className:[e,r?"on":"",n].filter(Boolean).join(" "),...i});var Q=({w:e="100%",h:r=12,r:n=6})=>h("div",{className:"skel",style:{width:e,height:r,borderRadius:n}}),nf=({variant:e})=>h(Pl,{children:[h(Nl,{children:[h(Q,{w:170,h:16}),e!=="form"&&h(M,{children:[h("div",{className:"grow"}),h(Q,{w:110,h:28,r:8})]})]}),e==="list"&&h("div",{className:"skel-rows",children:[0,1,2,3,4,5].map(r=>h("div",{className:"skel-row",children:[h(Q,{w:8,h:8,r:999}),h(Q,{w:140,h:13}),h("div",{className:"grow"}),h(Q,{w:90,h:11})]},r))}),e==="panel"&&h(M,{children:[h("div",{className:"section",children:[h(Q,{w:64,h:10}),h("div",{style:{marginTop:10,display:"flex",flexDirection:"column",gap:10},children:[0,1].map(r=>h("div",{className:"skel-card",children:[h(Q,{w:r?"45%":"55%",h:14}),h("div",{style:{height:8}}),h(Q,{w:r?"70%":"85%",h:11})]},r))})]}),h("div",{className:"section",children:[h(Q,{w:64,h:10}),h("div",{style:{marginTop:10,display:"flex",gap:8},children:[0,1,2].map(r=>h(Q,{w:72,h:24,r:999},r))})]}),h("div",{className:"section",style:{display:"flex",gap:8},children:[h(Q,{w:132,h:34,r:9}),h(Q,{w:80,h:34,r:9})]})]}),e==="table"&&h("div",{className:"skel-rows",children:[0,1,2,3].map(r=>h("div",{className:"skel-row",children:[h(Q,{w:"30%",h:13}),h("div",{className:"grow"}),h(Q,{w:"42%",h:13}),h(Q,{w:18,h:13})]},r))}),e==="grid"&&h("div",{className:"skel-grid",children:[0,1,2,3].map(r=>h("div",{className:"skel-card",children:[h(Q,{w:"50%",h:10}),h("div",{style:{height:8}}),h(Q,{w:"35%",h:20}),h("div",{style:{height:8}}),h(Q,{w:"100%",h:40,r:8})]},r))}),e==="logs"&&h("div",{style:{marginTop:14},children:h(Q,{w:"100%",h:150,r:10})}),e==="form"&&h("div",{className:"skel-rows",children:[[0,1,2].map(r=>h("div",{children:[h(Q,{w:88,h:10}),h("div",{style:{height:7}}),h(Q,{w:"100%",h:32,r:8})]},r)),h(Q,{w:150,h:34,r:9})]})]});var of=({points:e})=>{let r=De(null);return Pe(()=>{let n=r.current;if(!n)return;let i=window.devicePixelRatio||1,t=n.clientWidth||200,o=n.clientHeight||44;n.width=t*i,n.height=o*i;let a=n.getContext("2d");if(!a)return;a.scale(i,i),a.clearRect(0,0,t,o);let s=getComputedStyle(document.documentElement);if(!e.length){a.fillStyle=s.getPropertyValue("--muted"),a.font="11px sans-serif",a.fillText("no data",4,o/2);return}let u=e.map(d=>d.v),p=Math.min(...u),f=Math.max(...u)-p||1,l=s.getPropertyValue("--accent").trim()||"#6366f1",_=d=>d/Math.max(1,e.length-1)*(t-4)+2,g=d=>o-5-(d-p)/f*(o-12);a.beginPath(),e.forEach((d,y)=>{y===0?a.moveTo(_(y),g(d.v)):a.lineTo(_(y),g(d.v))}),a.strokeStyle=l,a.lineWidth=1.6,a.stroke(),a.lineTo(_(e.length-1),o-2),a.lineTo(_(0),o-2),a.closePath(),a.globalAlpha=.12,a.fillStyle=l,a.fill(),a.globalAlpha=1},[e]),h("canvas",{ref:r})},af=({scopes:e,onPick:r})=>{let n=Ym();return h("div",{className:"row",style:{marginTop:10},children:[h("span",{className:"sub",children:n("chooser.pick")}),e.map(i=>h(ti,{variant:"small",onClick:()=>r(i.name),children:i.name},i.name))]})};var C_=["1h","3h","24h","7d"];function E_(){let{result:e,call:r,connected:n}=Bm("np-metrics"),i=Jm(e),t=Jt(()=>Xm(i),[i]),[o,a]=Ae(!1),[s,u]=Ae({win:"3h",series:[]}),p=De(s);p.current=s;let f=Ce(g=>{let d=g;if(d){if(Array.isArray(d.choose_scope)&&d.choose_scope.length){u(y=>({...y,app:d.app??y.app,appName:d.app_name??y.appName,chooser:d.choose_scope}));return}Array.isArray(d.series)&&u(y=>({...y,app:d.app??y.app,appName:d.app_name??y.appName,scope:d.scope??y.scope,scopes:d.scopes??y.scopes,win:d.window??y.win,series:d.series??[],chooser:void 0,note:d.series?.some(k=>k.points.length)?void 0:t("metrics.noData")}))}},[t]);Pe(()=>f(e?.structuredContent),[e,f]);let l=Ce(async(g={})=>{let{app:d,scope:y,win:k}=p.current;if(d){u(I=>({...I,note:t("metrics.loading",{window:g.win??k})}));try{let I={app:d,window:g.win??k};(g.scope??y)&&(I.scope=g.scope??y),f((await r(_u.applicationMetricList,I)).structuredContent)}catch(I){u(x=>({...x,note:t("metrics.refreshFailed",{message:hi(I)})}))}}},[f,r,t]);Pe(()=>{if(!o)return;let g=setInterval(()=>{l()},3e4);return l(),()=>clearInterval(g)},[o,l]);let _=De(!1);return Pe(()=>{_.current||!n||!s.app||(_.current=!0,!s.chooser&&!o&&l())},[n,s.app,s.chooser]),e?h(Qm,{value:t,children:h(Pl,{children:[h(Nl,{children:[h("div",{className:"title grow",children:s.appName?t("metrics.title",{app:s.appName,scope:s.scope??""}):t("metrics.heading")}),h(ti,{variant:"small",className:"hasicon",on:o,onClick:()=>a(g=>!g),children:[h(Il,{name:o?"pause":"play"})," ",t("metrics.live")]})]}),s.chooser?h(af,{scopes:s.chooser,onPick:g=>{u(d=>({...d,scope:g,chooser:void 0})),l({scope:g})}}):h(M,{children:[h("div",{className:"toolbar",children:[s.scopes?.length?h("select",{value:s.scope??"",onChange:g=>{let d=g.target.value;u(y=>({...y,scope:d})),l({scope:d})},children:s.scopes.map(g=>h("option",{value:g.name,children:g.name},g.name))}):null,C_.map(g=>h(ti,{variant:"small",on:s.win===g,onClick:()=>{u(d=>({...d,win:g})),l({win:g})},children:g},g))]}),h("div",{className:"grid",children:s.series.map(g=>h("div",{className:"metric-card",children:[h("div",{className:"label",children:g.label}),h("div",{className:"val",children:[en(g.last)," ",h("small",{children:g.unit})]}),h(of,{points:g.points}),h("div",{className:"sub",style:{marginTop:4,fontSize:11},children:t("metrics.avgMax",{avg:en(g.avg),max:en(g.max)})})]},g.id))})]}),h(rf,{children:s.note})]})}):h(nf,{variant:"grid"})}tf(h(E_,{}));})();
1224
1224
  </script></body></html>