iobroker.ai-usage 0.7.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +15 -9
- package/admin/custom/assets/Components-C4wFRka3.js +1 -0
- package/admin/custom/assets/ConfigPanel-CGCj6Crq.js +1 -0
- package/admin/custom/assets/{index-CJLGptkU.js → index-DKkCKYc8.js} +1 -1
- package/admin/custom/assets/{mf-entry-bootstrap-0-fadc1b6e.js → mf-entry-bootstrap-0-d02c5f06.js} +1 -1
- package/admin/custom/assets/virtualExposes-CdmVMFlA.js +1 -0
- package/admin/custom/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-DblFyTyg.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-BjDe1IXR.js} +1 -1
- package/admin/custom/assets/virtual_mf-exposes-ssr___mfe_internal__AiUsageComponentSet__customComponents_js-DA9gAGbr.js +2 -0
- package/admin/custom/assets/{virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-B9kw23ao.js → virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-Wtw6jqAg.js} +2 -2
- package/admin/custom/customComponents.js +1 -1
- package/admin/custom/mf-manifest.json +1 -1
- package/build/lib/http.js +20 -53
- package/build/lib/http.js.map +2 -2
- package/build/lib/poll-engine.js +96 -14
- package/build/lib/poll-engine.js.map +2 -2
- package/build/lib/providers/anthropic-api.js +5 -20
- package/build/lib/providers/anthropic-api.js.map +2 -2
- package/build/lib/providers/chatgpt-sub.js +9 -10
- package/build/lib/providers/chatgpt-sub.js.map +2 -2
- package/build/lib/providers/claude-sub.js +7 -8
- package/build/lib/providers/claude-sub.js.map +2 -2
- package/build/lib/providers/deepseek.js +4 -7
- package/build/lib/providers/deepseek.js.map +2 -2
- package/build/lib/providers/gemini-sub.js +12 -12
- package/build/lib/providers/gemini-sub.js.map +2 -2
- package/build/lib/providers/openai.js +5 -20
- package/build/lib/providers/openai.js.map +2 -2
- package/build/lib/providers/openrouter.js +5 -11
- package/build/lib/providers/openrouter.js.map +2 -2
- package/build/lib/providers/report-utils.js +17 -0
- package/build/lib/providers/report-utils.js.map +2 -2
- package/build/lib/pure-helpers.js +14 -28
- package/build/lib/pure-helpers.js.map +2 -2
- package/build/lib/snapshot-tree.js +23 -8
- package/build/lib/snapshot-tree.js.map +2 -2
- package/build/lib/totals.js +7 -9
- package/build/lib/totals.js.map +2 -2
- package/build/main.js +114 -28
- package/build/main.js.map +2 -2
- package/io-package.json +14 -14
- package/package.json +1 -1
- package/admin/custom/assets/Components-52mNLgTp.js +0 -1
- package/admin/custom/assets/ConfigPanel-Balb6rXz.js +0 -1
- package/admin/custom/assets/virtualExposes-B7ft9DTx.js +0 -1
- package/admin/custom/assets/virtual_mf-exposes-ssr___mfe_internal__AiUsageComponentSet__customComponents_js-DpYtjEm8.js +0 -2
package/README.md
CHANGED
|
@@ -101,8 +101,9 @@ flap. `info.error` always names the cause.
|
|
|
101
101
|
**Only plan-wide windows raise the warning** — your session and your week — and the message names
|
|
102
102
|
the window it came from. A window belonging to a single model keeps its own datapoints but stays
|
|
103
103
|
out of it: a model you never use can sit at 100 % forever, and an alarm that never clears is worse
|
|
104
|
-
than none. Google
|
|
105
|
-
model anyway, build the automation on
|
|
104
|
+
than none. Google reports no plan-wide window at all, so there the fullest model window speaks for
|
|
105
|
+
the account and the warning names that model. To watch one model anyway, build the automation on
|
|
106
|
+
its own `limits.<window>.percent`.
|
|
106
107
|
|
|
107
108
|
---
|
|
108
109
|
|
|
@@ -125,6 +126,18 @@ After a successful sign-in the account is queried immediately, so values appear
|
|
|
125
126
|
Placeholder for the next version (at the beginning of the line):
|
|
126
127
|
### **WORK IN PROGRESS**
|
|
127
128
|
-->
|
|
129
|
+
### 0.8.0 (2026-08-27)
|
|
130
|
+
|
|
131
|
+
- Fixed: A switched-off instance no longer leaves its accounts standing green in the object tree — every account is marked as not delivering when the adapter stops
|
|
132
|
+
- Fixed: Signing out of a subscription now really stops it — the adapter kept polling with what it still held in memory, and the next token refresh even restored the deleted sign-in
|
|
133
|
+
- Fixed: A restarted adapter no longer shows every account as offline until its first answer arrives, complete with struck-through icon and a red badge in the settings
|
|
134
|
+
- Fixed: From the second round on, all accounts queried at the same moment instead of spread out, which is exactly what makes a provider throttle or lock an account
|
|
135
|
+
- Fixed: Limit windows and models a provider stops reporting are now removed instead of staying in the object tree forever, frozen on their last value
|
|
136
|
+
- Fixed: Signing in no longer risks signing the subscription straight back out, which could happen when the immediate first query collided with a scheduled one
|
|
137
|
+
- Fixed: Google accounts are now spoken for by their fullest model quota, and the warning names that model — before, every single model could raise the account's alarm
|
|
138
|
+
- Fixed: "Configured accounts" counts what you switched on, including accounts whose credential could not be read; the sign-in button no longer hangs for up to 15 seconds
|
|
139
|
+
- Fixed: A damaged or unreadable stored sign-in now says so in the log instead of looking exactly like "never signed in"
|
|
140
|
+
|
|
128
141
|
### 0.7.1 (2026-08-27)
|
|
129
142
|
|
|
130
143
|
- Fixed: Restarting the adapter no longer writes one unchanged value into every status datapoint, so a recorded history stays free of restart noise
|
|
@@ -145,13 +158,6 @@ After a successful sign-in the account is queried immediately, so values appear
|
|
|
145
158
|
- New: The settings page shows every switched-on account as online, limited or offline at a glance, with the full reason in plain text when you hover the badge
|
|
146
159
|
- Changed: The names of the total and per-account limit datapoints now say "plan-wide", matching what they have actually counted since 0.4.0
|
|
147
160
|
|
|
148
|
-
### 0.4.0 (2026-08-26)
|
|
149
|
-
|
|
150
|
-
- Fixed: A limit that belongs to a single model no longer reports the whole account as full, and the warning names the window it came from instead of just "usage"
|
|
151
|
-
- New: Each account shows whether the AI service itself is online, telling a service outage apart from a rejected sign-in or a missing internet connection
|
|
152
|
-
- New: Error reporting via Sentry — crashes reach the developer automatically, but only if you enabled diagnostics and error reporting in the ioBroker system settings
|
|
153
|
-
- Changed: New adapter icon — a network of nodes instead of the dark tile, so it reads as AI at a glance and sits cleanly in both the light and the dark admin
|
|
154
|
-
|
|
155
161
|
[Older changelogs can be found there](CHANGELOG_OLD.md)
|
|
156
162
|
|
|
157
163
|
## Support
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./ConfigPanel-CGCj6Crq.js";var t={ConfigPanel:e};export{t as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-DEdJInQG.js";import{Br as t,Dr as n,Er as r,Fi as i,Ha as a,Hi as o,Or as s,Ti as c,Tr as l,Va as u,Xr as d,_o as f,ai as p,ci as m,ei as h,ga as g,ii as _,in as v,kr as y,li as b,ni as x,oi as S}from"./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js";f();var C={"claude-sub":`claude`,"chatgpt-sub":`chatgpt`,"gemini-sub":`gemini`};function w(e,t){let n=C[e];if(n)return n;let r=t.replace(/^system\.credentials\./,``).trim().replace(/[^a-zA-Z0-9_-]/g,`_`).replace(/_{2,}/g,`_`).replace(/^_+|_+$/g,``);return r?`${r}-api`:``}function T(e,t){if(e==null)return null;let n=typeof t==`string`?t:``;return e===!0?{key:`aiu_stOffline`,color:`error`,title:n}:n?{key:`aiu_stLimited`,color:`warning`,title:n}:{key:`aiu_stOnline`,color:`success`,title:``}}var E=[{provider:`claude-sub`,label:`Claude`,captionKey:`aiu_capClaude`},{provider:`chatgpt-sub`,label:`ChatGPT`,captionKey:`aiu_capChatgpt`},{provider:`gemini-sub`,label:`Gemini`,captionKey:`aiu_capGemini`}];function D(e,t){let n=`${e} ${t}`.toLowerCase();return n.includes(`gemini`)?null:n.includes(`anthropic`)||n.includes(`claude`)?{provider:`anthropic-api`,label:`Anthropic`,needsAdminKey:!0}:n.includes(`chatgpt`)||n.includes(`openai`)?{provider:`openai`,label:`OpenAI`,needsAdminKey:!0}:n.includes(`deepseek`)?{provider:`deepseek`,label:`DeepSeek`,needsAdminKey:!1}:n.includes(`openrouter`)||n.includes(`router`)?{provider:`openrouter`,label:`OpenRouter`,needsAdminKey:!1}:null}var O=[{provider:`openrouter`,label:`OpenRouter`,needsAdminKey:!1},{provider:`deepseek`,label:`DeepSeek`,needsAdminKey:!1},{provider:`openai`,label:`OpenAI`,needsAdminKey:!0},{provider:`anthropic-api`,label:`Anthropic`,needsAdminKey:!0}];function k(e,t){return e.find(e=>e.provider===t)}function A(e,t,n,r){let i=e.filter(e=>e.provider!==t);return n?[...i,{name:r,provider:t,credentialId:``,warnThreshold:80}]:i}function j(e,t,n,r){let i=e.filter(e=>e.credentialId!==t.id);return!r||!n?i:[...i,{name:t.name,provider:n,credentialId:t.id,warnThreshold:80}]}function M(e,t,n){let r=Math.min(100,Math.max(10,Math.round(Number(n))||80));return e.map(e=>(t.credentialId?e.credentialId===t.credentialId:e.provider===t.provider)?{...e,warnThreshold:r}:e)}var N=class extends e{constructor(e){super(e),g(this,`timer`,null),this.state={...this.state,credentials:[],credentialsLoaded:!1,signIn:{},drafts:{},providerChoice:{},serviceState:{},busy:``}}async componentDidMount(){var e;(e=super.componentDidMount)==null||e.call(this),await this.loadCredentials(),await this.refresh(),this.timer=setInterval(()=>void this.refresh(),4e3)}componentWillUnmount(){var e;this.timer&&=(clearInterval(this.timer),null),(e=super.componentWillUnmount)==null||e.call(this)}async loadCredentials(){try{let e=await this.props.oContext.socket.getObjectViewSystem(`config`,`system.credentials.`,`system.credentials.香`),t=Object.values(e||{}).filter(e=>{var t;return!!e&&((t=e.native)==null?void 0:t.type)===`ai`}).map(e=>{var t,n;let r=e._id.substring(19),i=(t=e.common)==null?void 0:t.name,a=typeof i==`string`?i:(i==null?void 0:i.en)||Object.values(i||{})[0]||r;return{id:e._id,suffix:r,name:a,icon:typeof((n=e.common)==null?void 0:n.icon)==`string`?e.common.icon:void 0}}).sort((e,t)=>e.name.localeCompare(t.name));this.setState({credentials:t,credentialsLoaded:!0})}catch{this.setState({credentialsLoaded:!0})}}async refresh(){await this.refreshSignIn(),await this.refreshServiceState()}async refreshServiceState(){let e=this.props.oContext,t={};for(let n of this.accounts()){let r=w(n.provider,n.credentialId);if(r)try{let n=await e.socket.getState(`${e.adapterName}.${e.instance}.${r}.info.unreach`),i=await e.socket.getState(`${e.adapterName}.${e.instance}.${r}.info.error`);n&&n.val!==null&&n.val!==void 0&&(t[`${r}.unreach`]=n.val,t[`${r}.error`]=(i==null?void 0:i.val)??``)}catch{}}this.setState({serviceState:t})}renderServiceBadge(e,t){let n=w(e,t),r=T(this.state.serviceState[`${n}.unreach`],this.state.serviceState[`${n}.error`]);return r?u(m,{size:`small`,color:r.color,variant:`outlined`,label:v.t(r.key),title:r.title}):null}async refreshSignIn(){if(!this.props.alive)return;let e={};for(let t of E){if(!k(this.accounts(),t.provider))continue;let n=await this.ask(`signInStatus`,t.provider);n&&(e[t.provider]=n)}this.setState({signIn:e})}async ask(e,t,n){let r=this.props.oContext;try{let i=await r.socket.sendTo(`${r.adapterName}.${r.instance}`,e,{provider:t,value:n});return!i||i.error?{status:`failed`,reason:(i==null?void 0:i.error)||v.t(`aiu_noAnswer`)}:i}catch{return null}}async run(e,t,n){this.setState({busy:t});let r=await this.ask(e,t,n);this.setState(e=>({busy:``,signIn:r?{...e.signIn,[t]:r}:e.signIn,drafts:{...e.drafts,[t]:``}}))}accounts(){let t=e.getValue(this.props.data,`accounts`);return Array.isArray(t)?t:[]}commit(e){this.onChange(`accounts`,e)}renderThreshold(e,t,n){return u(d,{size:`small`,type:`number`,label:v.t(`aiu_warnAt`),defaultValue:t.warnThreshold||80,onBlur:e=>this.commit(M(this.accounts(),n,e.target.value)),slotProps:{htmlInput:{min:10,max:100,style:{width:60}},inputLabel:{shrink:!0}},sx:{ml:`auto`}},e)}renderSignIn(e){let t=this.state.signIn[e],i=this.state.busy===e;if(!this.props.alive)return u(c,{severity:`warning`,children:v.t(`aiu_instanceNotRunning`)});if(this.props.changed)return u(c,{severity:`info`,children:v.t(`aiu_saveFirst`)});if(!t)return u(b,{size:20});if(t.status===`signed-in`)return a(x,{sx:{display:`flex`,alignItems:`center`,gap:1,flexWrap:`wrap`},children:[u(y,{color:`success`}),u(h,{sx:{color:`success.main`},children:v.t(`aiu_signedIn`)}),u(_,{size:`small`,startIcon:u(r,{}),disabled:i,onClick:()=>void this.run(`signOut`,e),children:v.t(`aiu_signOut`)})]});if(t.status===`awaiting-device`)return a(x,{sx:{display:`flex`,flexDirection:`column`,gap:1.5},children:[u(h,{variant:`body2`,children:v.t(`aiu_deviceStep1`)}),a(x,{sx:{display:`flex`,gap:1,alignItems:`center`,flexWrap:`wrap`},children:[u(m,{label:t.userCode,sx:{fontSize:20,fontFamily:`monospace`,py:2.5,px:1}}),u(_,{size:`small`,startIcon:u(s,{}),onClick:()=>{var e;(e=navigator.clipboard)==null||e.writeText(t.userCode)},children:v.t(`aiu_copyCode`)}),u(_,{variant:`contained`,startIcon:u(n,{}),href:t.verificationUrl,target:`_blank`,rel:`noopener noreferrer`,children:v.t(`aiu_openPage`)})]}),u(c,{severity:`info`,children:v.t(`aiu_deviceWaiting`)})]});if(t.status===`awaiting-paste`){let r=t.flow===`paste-url`;return a(x,{sx:{display:`flex`,flexDirection:`column`,gap:1.5},children:[u(h,{variant:`body2`,children:v.t(r?`aiu_googleStep1`:`aiu_claudeStep1`)}),a(x,{sx:{display:`flex`,gap:1,flexWrap:`wrap`},children:[u(_,{variant:`contained`,startIcon:u(n,{}),href:t.url,target:`_blank`,rel:`noopener noreferrer`,children:v.t(`aiu_openSignIn`)}),u(_,{variant:`outlined`,startIcon:u(s,{}),onClick:()=>{var e;(e=navigator.clipboard)==null||e.writeText(t.url)},children:v.t(`aiu_copyLink`)})]}),r?u(c,{severity:`warning`,children:v.t(`aiu_googleErrorPageHint`)}):null,u(h,{variant:`body2`,children:v.t(r?`aiu_googleStep2`:`aiu_claudeStep2`)}),a(x,{sx:{display:`flex`,gap:1,alignItems:`center`,flexWrap:`wrap`},children:[u(d,{size:`small`,label:v.t(r?`aiu_addressLabel`:`aiu_codeLabel`),value:this.state.drafts[e]??``,onChange:t=>this.setState(n=>({drafts:{...n.drafts,[e]:t.target.value}})),sx:{minWidth:340,flexGrow:1}}),u(_,{variant:`contained`,disabled:i||!(this.state.drafts[e]??``).trim(),onClick:()=>void this.run(`signInSubmit`,e,this.state.drafts[e]),children:i?u(b,{size:20}):v.t(`aiu_redeem`)})]})]})}return a(x,{sx:{display:`flex`,flexDirection:`column`,gap:1},children:[t.status===`failed`?u(c,{severity:`error`,children:t.reason}):null,u(x,{children:u(_,{variant:`contained`,startIcon:u(n,{}),disabled:i,onClick:()=>void this.run(`signInStart`,e),children:i?u(b,{size:20}):v.t(`aiu_startSignIn`)})})]})}renderSubscriptionRow(e){let n=k(this.accounts(),e.provider);return a(x,{children:[a(x,{sx:{display:`flex`,alignItems:`center`,gap:1.5,py:1,borderBottom:1,borderColor:`divider`},children:[u(o,{sx:{width:28,height:28,bgcolor:`transparent`},children:u(l,{fontSize:`small`,color:`primary`})}),a(x,{sx:{minWidth:180},children:[u(h,{children:e.label}),u(h,{variant:`caption`,sx:{opacity:.7},children:v.t(e.captionKey)})]}),n?this.renderServiceBadge(e.provider,``):null,n?this.renderThreshold(`${e.provider}-t`,n,{provider:e.provider}):null,u(t,{checked:!!n,onChange:t=>this.commit(A(this.accounts(),e.provider,t.target.checked,e.label)),sx:{ml:n?0:`auto`}})]}),n?u(x,{sx:{pl:6,py:1.5,borderBottom:1,borderColor:`divider`},children:this.renderSignIn(e.provider)}):null]},e.provider)}renderCredentialRow(e){var n;let r=this.accounts(),s=r.find(t=>t.credentialId===e.id),f=D(e.suffix,e.name),p=(s==null?void 0:s.provider)||(f==null?void 0:f.provider)||this.state.providerChoice[e.id]||``,m=((n=O.find(e=>e.provider===p))==null?void 0:n.needsAdminKey)??(f==null?void 0:f.needsAdminKey)??!1,g=!f&&!this.state.providerChoice[e.id]&&!s;return a(x,{sx:{borderBottom:1,borderColor:`divider`},children:[a(x,{sx:{display:`flex`,alignItems:`center`,gap:1.5,py:1},children:[u(o,{src:e.icon,sx:{width:28,height:28,bgcolor:`transparent`},children:u(l,{fontSize:`small`})}),a(x,{sx:{minWidth:180},children:[u(h,{children:e.name}),u(h,{variant:`caption`,sx:{opacity:.7},children:v.t(`aiu_storedKey`)})]}),g?u(d,{select:!0,size:`small`,label:v.t(`aiu_provider`),value:this.state.providerChoice[e.id]||``,onChange:t=>this.setState(n=>({providerChoice:{...n.providerChoice,[e.id]:t.target.value}})),sx:{minWidth:170},children:O.map(e=>u(i,{value:e.provider,children:e.label},e.provider))}):null,s?this.renderServiceBadge(s.provider,e.id):null,s?this.renderThreshold(`${e.id}-t`,s,{credentialId:e.id}):null,u(t,{checked:!!s,disabled:!p,onChange:t=>this.commit(j(r,e,p,t.target.checked)),sx:{ml:s?0:`auto`}})]}),s&&m?u(c,{severity:`info`,sx:{mb:1},children:v.t(`aiu_adminKeyHint`)}):null]},e.id)}renderItem(){return u(x,{"data-testid":`aiu-config`,sx:{maxWidth:760},children:u(p,{variant:`outlined`,children:a(S,{children:[u(h,{variant:`h6`,sx:{mb:.5},children:v.t(`aiu_storedTitle`)}),u(h,{variant:`body2`,sx:{opacity:.8,mb:1},children:v.t(`aiu_storedHint`)}),E.map(e=>this.renderSubscriptionRow(e)),this.state.credentialsLoaded?this.state.credentials.map(e=>this.renderCredentialRow(e)):u(b,{size:24,sx:{mt:1}}),this.state.credentialsLoaded&&this.state.credentials.length===0?u(c,{severity:`info`,sx:{mt:1},children:v.t(`aiu_noCredentials`)}):null]})})})}};export{N as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-B9kw23ao.js";import"./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-DblFyTyg.js";import{Ba as e,Qt as t,Sa as n,Va as r,Za as i,_o as a,in as o,ni as s,sn as c}from"./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js";import{t as l}from"./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-CFn_lBXc.js";import{t as u}from"./ConfigPanel-Balb6rXz.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})(),a();var d={aiu_storedTitle:`AI accounts`,aiu_storedHint:`Switch on what you want to monitor. Subscriptions sign in with your own account; the entries below come from the admin's central credential storage (Settings → Credentials).`,aiu_capClaude:`Subscription — sign in once with your Claude account`,aiu_capChatgpt:`Subscription — sign in once with your ChatGPT account`,aiu_capGemini:`Subscription — sign in once with your Google account`,aiu_storedKey:`Stored key`,aiu_provider:`Provider`,aiu_warnAt:`Warn at %`,aiu_signedIn:`Signed in`,aiu_signOut:`Sign out`,aiu_startSignIn:`Sign in`,aiu_claudeStep1:`1. Open the sign-in page and log in with your Claude account.`,aiu_claudeStep2:`2. Copy the code shown there and redeem it here.`,aiu_codeLabel:`Code`,aiu_googleStep1:`1. Open the sign-in page and log in with your Google account.`,aiu_googleStep2:`2. Copy the ENTIRE address from your browser's address bar and paste it here.`,aiu_googleErrorPageHint:`Your browser will then show an error page ("site cannot be reached") — that is expected. Google sends the result to your own computer, where nothing is listening. The address bar still contains the sign-in result, and that is what is needed here.`,aiu_addressLabel:`Address from the browser`,aiu_deviceStep1:`1. Open the OpenAI page and type in this code:`,aiu_copyCode:`Copy code`,aiu_openPage:`Open page`,aiu_deviceWaiting:`Waiting for your confirmation — this card updates by itself once you are done.`,aiu_openSignIn:`Open sign-in page`,aiu_copyLink:`Copy link`,aiu_redeem:`Redeem`,aiu_saveFirst:`Save the settings first — then the sign-in can start.`,aiu_instanceNotRunning:`The instance is not running — start it to sign in.`,aiu_noAnswer:`the instance did not answer`,aiu_noCredentials:`No AI credentials stored yet — add them in the admin under Settings → Credentials.`,aiu_adminKeyHint:`This account needs an ADMIN key of your organisation, not the key the admin AI assistant uses. Personal accounts without an organisation cannot deliver usage reports.`,aiu_stOnline:`Online`,aiu_stLimited:`Limited`,aiu_stOffline:`Offline`},f={aiu_storedTitle:`KI-Konten`,aiu_storedHint:`Einschalten, was überwacht werden soll. Abos melden sich mit Ihrem eigenen Konto an; die Einträge darunter stammen aus dem zentralen Zugangsdaten-Speicher des Admin (Einstellungen → Zugangsdaten).`,aiu_capClaude:`Abo — einmalig mit Ihrem Claude-Konto anmelden`,aiu_capChatgpt:`Abo — einmalig mit Ihrem ChatGPT-Konto anmelden`,aiu_capGemini:`Abo — einmalig mit Ihrem Google-Konto anmelden`,aiu_storedKey:`Gespeicherter Schlüssel`,aiu_provider:`Anbieter`,aiu_warnAt:`Warnen ab %`,aiu_signedIn:`Angemeldet`,aiu_signOut:`Abmelden`,aiu_startSignIn:`Anmelden`,aiu_claudeStep1:`1. Anmeldeseite öffnen und mit Ihrem Claude-Konto anmelden.`,aiu_claudeStep2:`2. Den dort angezeigten Code kopieren und hier einlösen.`,aiu_codeLabel:`Code`,aiu_googleStep1:`1. Anmeldeseite öffnen und mit Ihrem Google-Konto anmelden.`,aiu_googleStep2:`2. Die KOMPLETTE Adresse aus der Adresszeile des Browsers kopieren und hier einfügen.`,aiu_googleErrorPageHint:`Ihr Browser zeigt danach eine Fehlerseite („Seite nicht erreichbar") — das ist richtig so. Google schickt das Ergebnis an Ihren eigenen Rechner, wo nichts darauf wartet. In der Adresszeile steht das Anmelde-Ergebnis trotzdem — und genau das wird hier gebraucht.`,aiu_addressLabel:`Adresse aus dem Browser`,aiu_deviceStep1:`1. Die OpenAI-Seite öffnen und diesen Code eintippen:`,aiu_copyCode:`Code kopieren`,aiu_openPage:`Seite öffnen`,aiu_deviceWaiting:`Warte auf Ihre Bestätigung — diese Karte aktualisiert sich von selbst, sobald Sie fertig sind.`,aiu_openSignIn:`Anmeldeseite öffnen`,aiu_copyLink:`Link kopieren`,aiu_redeem:`Einlösen`,aiu_saveFirst:`Zuerst die Einstellungen speichern — danach kann die Anmeldung starten.`,aiu_instanceNotRunning:`Die Instanz läuft nicht — zum Anmelden bitte starten.`,aiu_noAnswer:`die Instanz hat nicht geantwortet`,aiu_noCredentials:`Noch keine KI-Zugangsdaten gespeichert — im Admin unter Einstellungen → Zugangsdaten anlegen.`,aiu_adminKeyHint:`Dieses Konto braucht einen VERWALTUNGS-Schlüssel Ihrer Organisation, nicht den Schlüssel des Admin-KI-Assistenten. Einzelkonten ohne Organisation können keine Verbrauchs-Berichte liefern.`,aiu_stOnline:`Online`,aiu_stLimited:`Eingeschränkt`,aiu_stOffline:`Offline`},p={aiu_storedTitle:`Аккаунты ИИ`,aiu_storedHint:`Включите то, что нужно отслеживать. Подписки входят под вашим аккаунтом; записи ниже — из центрального хранилища учётных данных (Настройки → Учётные данные).`,aiu_capClaude:`Подписка — один раз войдите со своим аккаунтом Claude`,aiu_capChatgpt:`Подписка — один раз войдите со своим аккаунтом ChatGPT`,aiu_capGemini:`Подписка — один раз войдите со своим аккаунтом Google`,aiu_storedKey:`Сохранённый ключ`,aiu_provider:`Провайдер`,aiu_warnAt:`Предупреждать с %`,aiu_signedIn:`Вход выполнен`,aiu_signOut:`Выйти`,aiu_startSignIn:`Войти`,aiu_claudeStep1:`1. Откройте страницу входа и войдите со своим аккаунтом Claude.`,aiu_claudeStep2:`2. Скопируйте показанный код и активируйте его здесь.`,aiu_codeLabel:`Код`,aiu_googleStep1:`1. Откройте страницу входа и войдите со своим аккаунтом Google.`,aiu_googleStep2:`2. Скопируйте ВЕСЬ адрес из адресной строки браузера и вставьте сюда.`,aiu_googleErrorPageHint:`Затем браузер покажет страницу ошибки («не удаётся открыть сайт») — так и должно быть. Google отправляет результат на ваш компьютер, где его никто не ждёт. Но в адресной строке результат входа есть — именно он здесь и нужен.`,aiu_addressLabel:`Адрес из браузера`,aiu_deviceStep1:`1. Откройте страницу OpenAI и введите этот код:`,aiu_copyCode:`Копировать код`,aiu_openPage:`Открыть страницу`,aiu_deviceWaiting:`Ожидание подтверждения — карточка обновится сама.`,aiu_openSignIn:`Открыть страницу входа`,aiu_copyLink:`Копировать ссылку`,aiu_redeem:`Активировать`,aiu_saveFirst:`Сначала сохраните настройки — затем можно начать вход.`,aiu_instanceNotRunning:`Экземпляр не запущен — запустите его для входа.`,aiu_noAnswer:`экземпляр не ответил`,aiu_noCredentials:`Данные доступа ИИ ещё не сохранены — добавьте их: Настройки → Учётные данные.`,aiu_adminKeyHint:`Этому аккаунту нужен АДМИНИСТРАТИВНЫЙ ключ организации, а не ключ ИИ-ассистента. Личные аккаунты без организации не выдают отчёты о расходе.`,aiu_stOnline:`В сети`,aiu_stLimited:`Ограничено`,aiu_stOffline:`Не в сети`},m={aiu_storedTitle:`Contas de IA`,aiu_storedHint:`Ative o que deseja monitorizar. As assinaturas iniciam sessão com a sua conta; as entradas abaixo vêm do armazenamento central de credenciais (Definições → Credenciais).`,aiu_capClaude:`Assinatura — inicie sessão uma vez com a sua conta Claude`,aiu_capChatgpt:`Assinatura — inicie sessão uma vez com a sua conta ChatGPT`,aiu_capGemini:`Assinatura — inicie sessão uma vez com a sua conta Google`,aiu_storedKey:`Chave guardada`,aiu_provider:`Fornecedor`,aiu_warnAt:`Avisar a partir de %`,aiu_signedIn:`Sessão iniciada`,aiu_signOut:`Terminar sessão`,aiu_startSignIn:`Iniciar sessão`,aiu_claudeStep1:`1. Abra a página de início de sessão e entre com a sua conta Claude.`,aiu_claudeStep2:`2. Copie o código mostrado e resgate-o aqui.`,aiu_codeLabel:`Código`,aiu_googleStep1:`1. Abra a página de início de sessão e entre com a sua conta Google.`,aiu_googleStep2:`2. Copie o endereço COMPLETO da barra de endereços e cole-o aqui.`,aiu_googleErrorPageHint:`O navegador mostrará depois uma página de erro («não é possível aceder») — isso é esperado. A Google envia o resultado para o seu computador, onde nada está à escuta. O endereço contém na mesma o resultado — e é isso que é preciso aqui.`,aiu_addressLabel:`Endereço do navegador`,aiu_deviceStep1:`1. Abra a página da OpenAI e introduza este código:`,aiu_copyCode:`Copiar código`,aiu_openPage:`Abrir página`,aiu_deviceWaiting:`À espera da sua confirmação — este cartão atualiza-se sozinho.`,aiu_openSignIn:`Abrir página de início de sessão`,aiu_copyLink:`Copiar link`,aiu_redeem:`Resgatar`,aiu_saveFirst:`Guarde primeiro as definições — depois o início de sessão pode começar.`,aiu_instanceNotRunning:`A instância não está em execução — inicie-a para entrar.`,aiu_noAnswer:`a instância não respondeu`,aiu_noCredentials:`Ainda não há credenciais de IA guardadas — adicione-as em Definições → Credenciais.`,aiu_adminKeyHint:`Esta conta precisa de uma chave de ADMINISTRAÇÃO da organização, não da chave do assistente de IA. Contas pessoais sem organização não fornecem relatórios de uso.`,aiu_stOnline:`Online`,aiu_stLimited:`Limitado`,aiu_stOffline:`Offline`},h={aiu_storedTitle:`AI-accounts`,aiu_storedHint:`Schakel in wat u wilt bewaken. Abonnementen melden zich aan met uw eigen account; de vermeldingen daaronder komen uit de centrale opslag van toegangsgegevens (Instellingen → Toegangsgegevens).`,aiu_capClaude:`Abonnement — meld u eenmalig aan met uw Claude-account`,aiu_capChatgpt:`Abonnement — meld u eenmalig aan met uw ChatGPT-account`,aiu_capGemini:`Abonnement — meld u eenmalig aan met uw Google-account`,aiu_storedKey:`Opgeslagen sleutel`,aiu_provider:`Aanbieder`,aiu_warnAt:`Waarschuwen vanaf %`,aiu_signedIn:`Aangemeld`,aiu_signOut:`Afmelden`,aiu_startSignIn:`Aanmelden`,aiu_claudeStep1:`1. Open de aanmeldpagina en log in met uw Claude-account.`,aiu_claudeStep2:`2. Kopieer de getoonde code en wissel die hier in.`,aiu_codeLabel:`Code`,aiu_googleStep1:`1. Open de aanmeldpagina en log in met uw Google-account.`,aiu_googleStep2:`2. Kopieer het VOLLEDIGE adres uit de adresbalk en plak het hier.`,aiu_googleErrorPageHint:`Uw browser toont daarna een foutpagina («site kan niet worden bereikt») — dat hoort zo. Google stuurt het resultaat naar uw eigen computer, waar niets luistert. In de adresbalk staat het resultaat wél — en dat is wat hier nodig is.`,aiu_addressLabel:`Adres uit de browser`,aiu_deviceStep1:`1. Open de OpenAI-pagina en typ deze code in:`,aiu_copyCode:`Code kopiëren`,aiu_openPage:`Pagina openen`,aiu_deviceWaiting:`Wachten op uw bevestiging — deze kaart werkt zichzelf bij.`,aiu_openSignIn:`Aanmeldpagina openen`,aiu_copyLink:`Link kopiëren`,aiu_redeem:`Inwisselen`,aiu_saveFirst:`Sla eerst de instellingen op — daarna kan het aanmelden starten.`,aiu_instanceNotRunning:`De instantie draait niet — start deze om aan te melden.`,aiu_noAnswer:`de instantie antwoordde niet`,aiu_noCredentials:`Nog geen AI-toegangsgegevens opgeslagen — voeg ze toe via Instellingen → Toegangsgegevens.`,aiu_adminKeyHint:`Dit account heeft een BEHEER-sleutel van uw organisatie nodig, niet die van de AI-assistent. Persoonlijke accounts zonder organisatie leveren geen verbruiksrapporten.`,aiu_stOnline:`Online`,aiu_stLimited:`Beperkt`,aiu_stOffline:`Offline`},g={aiu_storedTitle:`Comptes IA`,aiu_storedHint:`Activez ce que vous voulez surveiller. Les abonnements se connectent avec votre propre compte ; les entrées ci-dessous viennent du stockage central des identifiants (Réglages → Identifiants).`,aiu_capClaude:`Abonnement — connectez-vous une fois avec votre compte Claude`,aiu_capChatgpt:`Abonnement — connectez-vous une fois avec votre compte ChatGPT`,aiu_capGemini:`Abonnement — connectez-vous une fois avec votre compte Google`,aiu_storedKey:`Clé enregistrée`,aiu_provider:`Fournisseur`,aiu_warnAt:`Avertir à partir de %`,aiu_signedIn:`Connecté`,aiu_signOut:`Se déconnecter`,aiu_startSignIn:`Se connecter`,aiu_claudeStep1:`1. Ouvrez la page de connexion et connectez-vous avec votre compte Claude.`,aiu_claudeStep2:`2. Copiez le code affiché et validez-le ici.`,aiu_codeLabel:`Code`,aiu_googleStep1:`1. Ouvrez la page de connexion et connectez-vous avec votre compte Google.`,aiu_googleStep2:`2. Copiez l'adresse COMPLÈTE depuis la barre d'adresse et collez-la ici.`,aiu_googleErrorPageHint:`Votre navigateur affichera ensuite une page d'erreur (« site inaccessible ») — c'est normal. Google envoie le résultat vers votre propre ordinateur, où rien n'écoute. L'adresse contient malgré tout le résultat — et c'est précisément ce qu'il faut ici.`,aiu_addressLabel:`Adresse du navigateur`,aiu_deviceStep1:`1. Ouvrez la page OpenAI et saisissez ce code :`,aiu_copyCode:`Copier le code`,aiu_openPage:`Ouvrir la page`,aiu_deviceWaiting:`En attente de votre confirmation — cette carte se met à jour toute seule.`,aiu_openSignIn:`Ouvrir la page de connexion`,aiu_copyLink:`Copier le lien`,aiu_redeem:`Valider`,aiu_saveFirst:`Enregistrez d'abord les réglages — la connexion pourra ensuite démarrer.`,aiu_instanceNotRunning:`L'instance ne tourne pas — démarrez-la pour vous connecter.`,aiu_noAnswer:`l'instance n'a pas répondu`,aiu_noCredentials:`Aucun identifiant IA enregistré — ajoutez-les via Réglages → Identifiants.`,aiu_adminKeyHint:`Ce compte nécessite une clé d'ADMINISTRATION de votre organisation, pas celle de l'assistant IA. Les comptes personnels sans organisation ne fournissent pas de rapports d'utilisation.`,aiu_stOnline:`En ligne`,aiu_stLimited:`Limité`,aiu_stOffline:`Hors ligne`},_={aiu_storedTitle:`Account IA`,aiu_storedHint:`Attiva ciò che vuoi monitorare. Gli abbonamenti accedono con il tuo account; le voci sotto provengono dall'archivio centrale delle credenziali (Impostazioni → Credenziali).`,aiu_capClaude:`Abbonamento — accedi una volta con il tuo account Claude`,aiu_capChatgpt:`Abbonamento — accedi una volta con il tuo account ChatGPT`,aiu_capGemini:`Abbonamento — accedi una volta con il tuo account Google`,aiu_storedKey:`Chiave salvata`,aiu_provider:`Fornitore`,aiu_warnAt:`Avvisa da %`,aiu_signedIn:`Accesso effettuato`,aiu_signOut:`Disconnetti`,aiu_startSignIn:`Accedi`,aiu_claudeStep1:`1. Apri la pagina di accesso ed entra con il tuo account Claude.`,aiu_claudeStep2:`2. Copia il codice mostrato e riscattalo qui.`,aiu_codeLabel:`Codice`,aiu_googleStep1:`1. Apri la pagina di accesso ed entra con il tuo account Google.`,aiu_googleStep2:`2. Copia l'INTERO indirizzo dalla barra degli indirizzi e incollalo qui.`,aiu_googleErrorPageHint:`Il browser mostrerà poi una pagina di errore («sito non raggiungibile») — è corretto così. Google invia il risultato al tuo computer, dove nessuno è in ascolto. Nell'indirizzo il risultato c'è comunque — ed è proprio quello che serve qui.`,aiu_addressLabel:`Indirizzo dal browser`,aiu_deviceStep1:`1. Apri la pagina OpenAI e digita questo codice:`,aiu_copyCode:`Copia codice`,aiu_openPage:`Apri pagina`,aiu_deviceWaiting:`In attesa della tua conferma — questa scheda si aggiorna da sola.`,aiu_openSignIn:`Apri pagina di accesso`,aiu_copyLink:`Copia link`,aiu_redeem:`Riscatta`,aiu_saveFirst:`Salva prima le impostazioni — poi l'accesso può iniziare.`,aiu_instanceNotRunning:`L'istanza non è in esecuzione — avviala per accedere.`,aiu_noAnswer:`l'istanza non ha risposto`,aiu_noCredentials:`Nessuna credenziale IA salvata — aggiungila in Impostazioni → Credenziali.`,aiu_adminKeyHint:`Questo account richiede una chiave di AMMINISTRAZIONE della tua organizzazione, non quella dell'assistente IA. Gli account personali senza organizzazione non forniscono rapporti di utilizzo.`,aiu_stOnline:`Online`,aiu_stLimited:`Limitato`,aiu_stOffline:`Offline`},v={aiu_storedTitle:`Cuentas de IA`,aiu_storedHint:`Active lo que quiera supervisar. Las suscripciones inician sesión con su propia cuenta; las entradas de abajo provienen del almacén central de credenciales (Ajustes → Credenciales).`,aiu_capClaude:`Suscripción — inicie sesión una vez con su cuenta Claude`,aiu_capChatgpt:`Suscripción — inicie sesión una vez con su cuenta ChatGPT`,aiu_capGemini:`Suscripción — inicie sesión una vez con su cuenta Google`,aiu_storedKey:`Clave guardada`,aiu_provider:`Proveedor`,aiu_warnAt:`Avisar desde %`,aiu_signedIn:`Sesión iniciada`,aiu_signOut:`Cerrar sesión`,aiu_startSignIn:`Iniciar sesión`,aiu_claudeStep1:`1. Abra la página de inicio de sesión y entre con su cuenta Claude.`,aiu_claudeStep2:`2. Copie el código mostrado y canjéelo aquí.`,aiu_codeLabel:`Código`,aiu_googleStep1:`1. Abra la página de inicio de sesión y entre con su cuenta Google.`,aiu_googleStep2:`2. Copie la dirección COMPLETA de la barra de direcciones y péguela aquí.`,aiu_googleErrorPageHint:`Su navegador mostrará después una página de error («no se puede acceder al sitio») — es lo esperado. Google envía el resultado a su propio ordenador, donde nada está escuchando. La dirección contiene el resultado igualmente — y eso es lo que hace falta aquí.`,aiu_addressLabel:`Dirección del navegador`,aiu_deviceStep1:`1. Abra la página de OpenAI y escriba este código:`,aiu_copyCode:`Copiar código`,aiu_openPage:`Abrir página`,aiu_deviceWaiting:`Esperando su confirmación — esta tarjeta se actualiza sola.`,aiu_openSignIn:`Abrir página de inicio de sesión`,aiu_copyLink:`Copiar enlace`,aiu_redeem:`Canjear`,aiu_saveFirst:`Guarde primero la configuración — después puede comenzar el inicio de sesión.`,aiu_instanceNotRunning:`La instancia no está en marcha — iníciela para entrar.`,aiu_noAnswer:`la instancia no respondió`,aiu_noCredentials:`Aún no hay credenciales de IA guardadas — añádalas en Ajustes → Credenciales.`,aiu_adminKeyHint:`Esta cuenta necesita una clave de ADMINISTRACIÓN de su organización, no la del asistente de IA. Las cuentas personales sin organización no ofrecen informes de uso.`,aiu_stOnline:`En línea`,aiu_stLimited:`Limitado`,aiu_stOffline:`Sin conexión`},y={aiu_storedTitle:`Konta AI`,aiu_storedHint:`Włącz to, co ma być monitorowane. Subskrypcje logują się Twoim kontem; pozycje poniżej pochodzą z centralnego magazynu danych dostępu (Ustawienia → Dane dostępu).`,aiu_capClaude:`Subskrypcja — zaloguj się raz kontem Claude`,aiu_capChatgpt:`Subskrypcja — zaloguj się raz kontem ChatGPT`,aiu_capGemini:`Subskrypcja — zaloguj się raz kontem Google`,aiu_storedKey:`Zapisany klucz`,aiu_provider:`Dostawca`,aiu_warnAt:`Ostrzegaj od %`,aiu_signedIn:`Zalogowano`,aiu_signOut:`Wyloguj`,aiu_startSignIn:`Zaloguj`,aiu_claudeStep1:`1. Otwórz stronę logowania i zaloguj się kontem Claude.`,aiu_claudeStep2:`2. Skopiuj pokazany kod i zrealizuj go tutaj.`,aiu_codeLabel:`Kod`,aiu_googleStep1:`1. Otwórz stronę logowania i zaloguj się kontem Google.`,aiu_googleStep2:`2. Skopiuj CAŁY adres z paska adresu i wklej go tutaj.`,aiu_googleErrorPageHint:`Przeglądarka pokaże potem stronę błędu («nie można otworzyć strony») — tak ma być. Google wysyła wynik na Twój komputer, gdzie nic nie nasłuchuje. W pasku adresu wynik jednak jest — i właśnie on jest tu potrzebny.`,aiu_addressLabel:`Adres z przeglądarki`,aiu_deviceStep1:`1. Otwórz stronę OpenAI i wpisz ten kod:`,aiu_copyCode:`Kopiuj kod`,aiu_openPage:`Otwórz stronę`,aiu_deviceWaiting:`Czekam na potwierdzenie — ta karta odświeży się sama.`,aiu_openSignIn:`Otwórz stronę logowania`,aiu_copyLink:`Kopiuj link`,aiu_redeem:`Zrealizuj`,aiu_saveFirst:`Najpierw zapisz ustawienia — potem można rozpocząć logowanie.`,aiu_instanceNotRunning:`Instancja nie działa — uruchom ją, aby się zalogować.`,aiu_noAnswer:`instancja nie odpowiedziała`,aiu_noCredentials:`Brak zapisanych danych dostępu AI — dodaj je w Ustawienia → Dane dostępu.`,aiu_adminKeyHint:`To konto wymaga klucza ADMINISTRACYJNEGO organizacji, a nie klucza asystenta AI. Konta osobiste bez organizacji nie dostarczają raportów zużycia.`,aiu_stOnline:`Online`,aiu_stLimited:`Ograniczone`,aiu_stOffline:`Offline`},b={aiu_storedTitle:`Акаунти ШІ`,aiu_storedHint:`Увімкніть те, що треба відстежувати. Підписки входять під вашим акаунтом; записи нижче — з центрального сховища даних доступу (Налаштування → Дані доступу).`,aiu_capClaude:`Підписка — увійдіть один раз акаунтом Claude`,aiu_capChatgpt:`Підписка — увійдіть один раз акаунтом ChatGPT`,aiu_capGemini:`Підписка — увійдіть один раз акаунтом Google`,aiu_storedKey:`Збережений ключ`,aiu_provider:`Постачальник`,aiu_warnAt:`Попереджати від %`,aiu_signedIn:`Вхід виконано`,aiu_signOut:`Вийти`,aiu_startSignIn:`Увійти`,aiu_claudeStep1:`1. Відкрийте сторінку входу та увійдіть акаунтом Claude.`,aiu_claudeStep2:`2. Скопіюйте показаний код і активуйте його тут.`,aiu_codeLabel:`Код`,aiu_googleStep1:`1. Відкрийте сторінку входу та увійдіть акаунтом Google.`,aiu_googleStep2:`2. Скопіюйте ВЕСЬ адрес з адресного рядка та вставте сюди.`,aiu_googleErrorPageHint:`Далі браузер покаже сторінку помилки («сайт недоступний») — так і має бути. Google надсилає результат на ваш комп'ютер, де ніхто не слухає. В адресному рядку результат усе одно є — саме він тут і потрібен.`,aiu_addressLabel:`Адреса з браузера`,aiu_deviceStep1:`1. Відкрийте сторінку OpenAI та введіть цей код:`,aiu_copyCode:`Копіювати код`,aiu_openPage:`Відкрити сторінку`,aiu_deviceWaiting:`Очікую підтвердження — картка оновиться сама.`,aiu_openSignIn:`Відкрити сторінку входу`,aiu_copyLink:`Копіювати посилання`,aiu_redeem:`Активувати`,aiu_saveFirst:`Спочатку збережіть налаштування — потім можна починати вхід.`,aiu_instanceNotRunning:`Екземпляр не запущено — запустіть його для входу.`,aiu_noAnswer:`екземпляр не відповів`,aiu_noCredentials:`Ще немає збережених даних доступу ШІ — додайте їх у Налаштування → Дані доступу.`,aiu_adminKeyHint:`Цей акаунт потребує АДМІНІСТРАТИВНОГО ключа організації, а не ключа ШІ-асистента. Особисті акаунти без організації не дають звітів про використання.`,aiu_stOnline:`У мережі`,aiu_stLimited:`Обмежено`,aiu_stOffline:`Не в мережі`},x={aiu_storedTitle:`AI 账户`,aiu_storedHint:`开启需要监控的项目。订阅使用您自己的账户登录;下方条目来自管理界面的中央凭据存储(设置 → 凭据)。`,aiu_capClaude:`订阅——使用您的 Claude 账户登录一次`,aiu_capChatgpt:`订阅——使用您的 ChatGPT 账户登录一次`,aiu_capGemini:`订阅——使用您的 Google 账户登录一次`,aiu_storedKey:`已保存的密钥`,aiu_provider:`提供商`,aiu_warnAt:`警告阈值 %`,aiu_signedIn:`已登录`,aiu_signOut:`退出登录`,aiu_startSignIn:`登录`,aiu_claudeStep1:`1. 打开登录页面并使用您的 Claude 账户登录。`,aiu_claudeStep2:`2. 复制页面显示的代码并在此兑换。`,aiu_codeLabel:`代码`,aiu_googleStep1:`1. 打开登录页面并使用您的 Google 账户登录。`,aiu_googleStep2:`2. 复制浏览器地址栏中的完整地址并粘贴到这里。`,aiu_googleErrorPageHint:`随后浏览器会显示错误页面(无法访问此网站)——这是正常的。Google 把结果发送到您自己的电脑,而那里没有程序在接收。地址栏中仍然包含登录结果——这正是此处需要的。`,aiu_addressLabel:`来自浏览器的地址`,aiu_deviceStep1:`1. 打开 OpenAI 页面并输入此代码:`,aiu_copyCode:`复制代码`,aiu_openPage:`打开页面`,aiu_deviceWaiting:`正在等待您的确认——完成后此卡片会自动更新。`,aiu_openSignIn:`打开登录页面`,aiu_copyLink:`复制链接`,aiu_redeem:`兑换`,aiu_saveFirst:`请先保存设置——之后即可开始登录。`,aiu_instanceNotRunning:`实例未运行——请启动后再登录。`,aiu_noAnswer:`实例没有响应`,aiu_noCredentials:`尚未保存任何 AI 凭据——请在 设置 → 凭据 中添加。`,aiu_adminKeyHint:`此账户需要您所在组织的管理密钥,而不是管理界面 AI 助手使用的密钥。没有组织的个人账户无法提供用量报告。`,aiu_stOnline:`在线`,aiu_stLimited:`受限`,aiu_stOffline:`离线`},S=class extends t{constructor(e){super(e,{...e}),this.state={...this.state,data:{accounts:[]},originalData:{accounts:[]},theme:this.createTheme()};let t={en:d,de:f,ru:p,pt:m,nl:h,fr:g,it:_,es:v,pl:y,uk:b,"zh-cn":x};for(let[e,n]of Object.entries(t))o.extendTranslations(n,e);let n=(navigator.language||navigator.userLanguage||`en`).toLowerCase();o.setLanguage(n.startsWith(`zh`)?`zh-cn`:n.substring(0,2))}render(){return this.state.loaded?r(e,{injectFirst:!0,children:r(n,{theme:this.state.theme,children:r(s,{sx:{height:`100%`,bgcolor:`background.default`,color:`text.primary`},children:r(`div`,{style:{padding:50,width:760},children:r(u,{oContext:{adapterName:`ai-usage`,socket:this.socket,instance:0,themeType:this.state.theme.palette.mode,isFloatComma:!0,dateFormat:``,forceUpdate:()=>{},systemConfig:{},theme:this.state.theme,_themeName:this.state.themeName,onCommandRunning:()=>{}},alive:!0,changed:!1,themeName:this.state.theme.palette.mode,common:{},attr:`_accounts`,data:this.state.data,originalData:this.state.originalData,onError:()=>{},schema:{url:`custom/customComponents.js`,i18n:!0,name:`AiUsageComponentSet/Components/ConfigPanel`,type:`custom`},onChange:e=>this.setState({data:e})})})})})}):r(e,{injectFirst:!0,children:r(n,{theme:this.state.theme,children:r(c,{themeType:this.state.themeType})})})}};a(),window.adapterName=`ai-usage`;var C=document.getElementById(`root`);C&&l(C).render(r(i.StrictMode,{children:r(S,{socket:{port:8081}})}));
|
|
1
|
+
import"./virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-Wtw6jqAg.js";import"./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-BjDe1IXR.js";import{Ba as e,Qt as t,Sa as n,Va as r,Za as i,_o as a,in as o,ni as s,sn as c}from"./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js";import{t as l}from"./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-CFn_lBXc.js";import{t as u}from"./ConfigPanel-CGCj6Crq.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})(),a();var d={aiu_storedTitle:`AI accounts`,aiu_storedHint:`Switch on what you want to monitor. Subscriptions sign in with your own account; the entries below come from the admin's central credential storage (Settings → Credentials).`,aiu_capClaude:`Subscription — sign in once with your Claude account`,aiu_capChatgpt:`Subscription — sign in once with your ChatGPT account`,aiu_capGemini:`Subscription — sign in once with your Google account`,aiu_storedKey:`Stored key`,aiu_provider:`Provider`,aiu_warnAt:`Warn at %`,aiu_signedIn:`Signed in`,aiu_signOut:`Sign out`,aiu_startSignIn:`Sign in`,aiu_claudeStep1:`1. Open the sign-in page and log in with your Claude account.`,aiu_claudeStep2:`2. Copy the code shown there and redeem it here.`,aiu_codeLabel:`Code`,aiu_googleStep1:`1. Open the sign-in page and log in with your Google account.`,aiu_googleStep2:`2. Copy the ENTIRE address from your browser's address bar and paste it here.`,aiu_googleErrorPageHint:`Your browser will then show an error page ("site cannot be reached") — that is expected. Google sends the result to your own computer, where nothing is listening. The address bar still contains the sign-in result, and that is what is needed here.`,aiu_addressLabel:`Address from the browser`,aiu_deviceStep1:`1. Open the OpenAI page and type in this code:`,aiu_copyCode:`Copy code`,aiu_openPage:`Open page`,aiu_deviceWaiting:`Waiting for your confirmation — this card updates by itself once you are done.`,aiu_openSignIn:`Open sign-in page`,aiu_copyLink:`Copy link`,aiu_redeem:`Redeem`,aiu_saveFirst:`Save the settings first — then the sign-in can start.`,aiu_instanceNotRunning:`The instance is not running — start it to sign in.`,aiu_noAnswer:`the instance did not answer`,aiu_noCredentials:`No AI credentials stored yet — add them in the admin under Settings → Credentials.`,aiu_adminKeyHint:`This account needs an ADMIN key of your organisation, not the key the admin AI assistant uses. Personal accounts without an organisation cannot deliver usage reports.`,aiu_stOnline:`Online`,aiu_stLimited:`Limited`,aiu_stOffline:`Offline`},f={aiu_storedTitle:`KI-Konten`,aiu_storedHint:`Einschalten, was überwacht werden soll. Abos melden sich mit Ihrem eigenen Konto an; die Einträge darunter stammen aus dem zentralen Zugangsdaten-Speicher des Admin (Einstellungen → Zugangsdaten).`,aiu_capClaude:`Abo — einmalig mit Ihrem Claude-Konto anmelden`,aiu_capChatgpt:`Abo — einmalig mit Ihrem ChatGPT-Konto anmelden`,aiu_capGemini:`Abo — einmalig mit Ihrem Google-Konto anmelden`,aiu_storedKey:`Gespeicherter Schlüssel`,aiu_provider:`Anbieter`,aiu_warnAt:`Warnen ab %`,aiu_signedIn:`Angemeldet`,aiu_signOut:`Abmelden`,aiu_startSignIn:`Anmelden`,aiu_claudeStep1:`1. Anmeldeseite öffnen und mit Ihrem Claude-Konto anmelden.`,aiu_claudeStep2:`2. Den dort angezeigten Code kopieren und hier einlösen.`,aiu_codeLabel:`Code`,aiu_googleStep1:`1. Anmeldeseite öffnen und mit Ihrem Google-Konto anmelden.`,aiu_googleStep2:`2. Die KOMPLETTE Adresse aus der Adresszeile des Browsers kopieren und hier einfügen.`,aiu_googleErrorPageHint:`Ihr Browser zeigt danach eine Fehlerseite („Seite nicht erreichbar") — das ist richtig so. Google schickt das Ergebnis an Ihren eigenen Rechner, wo nichts darauf wartet. In der Adresszeile steht das Anmelde-Ergebnis trotzdem — und genau das wird hier gebraucht.`,aiu_addressLabel:`Adresse aus dem Browser`,aiu_deviceStep1:`1. Die OpenAI-Seite öffnen und diesen Code eintippen:`,aiu_copyCode:`Code kopieren`,aiu_openPage:`Seite öffnen`,aiu_deviceWaiting:`Warte auf Ihre Bestätigung — diese Karte aktualisiert sich von selbst, sobald Sie fertig sind.`,aiu_openSignIn:`Anmeldeseite öffnen`,aiu_copyLink:`Link kopieren`,aiu_redeem:`Einlösen`,aiu_saveFirst:`Zuerst die Einstellungen speichern — danach kann die Anmeldung starten.`,aiu_instanceNotRunning:`Die Instanz läuft nicht — zum Anmelden bitte starten.`,aiu_noAnswer:`die Instanz hat nicht geantwortet`,aiu_noCredentials:`Noch keine KI-Zugangsdaten gespeichert — im Admin unter Einstellungen → Zugangsdaten anlegen.`,aiu_adminKeyHint:`Dieses Konto braucht einen VERWALTUNGS-Schlüssel Ihrer Organisation, nicht den Schlüssel des Admin-KI-Assistenten. Einzelkonten ohne Organisation können keine Verbrauchs-Berichte liefern.`,aiu_stOnline:`Online`,aiu_stLimited:`Eingeschränkt`,aiu_stOffline:`Offline`},p={aiu_storedTitle:`Аккаунты ИИ`,aiu_storedHint:`Включите то, что нужно отслеживать. Подписки входят под вашим аккаунтом; записи ниже — из центрального хранилища учётных данных (Настройки → Учётные данные).`,aiu_capClaude:`Подписка — один раз войдите со своим аккаунтом Claude`,aiu_capChatgpt:`Подписка — один раз войдите со своим аккаунтом ChatGPT`,aiu_capGemini:`Подписка — один раз войдите со своим аккаунтом Google`,aiu_storedKey:`Сохранённый ключ`,aiu_provider:`Провайдер`,aiu_warnAt:`Предупреждать с %`,aiu_signedIn:`Вход выполнен`,aiu_signOut:`Выйти`,aiu_startSignIn:`Войти`,aiu_claudeStep1:`1. Откройте страницу входа и войдите со своим аккаунтом Claude.`,aiu_claudeStep2:`2. Скопируйте показанный код и активируйте его здесь.`,aiu_codeLabel:`Код`,aiu_googleStep1:`1. Откройте страницу входа и войдите со своим аккаунтом Google.`,aiu_googleStep2:`2. Скопируйте ВЕСЬ адрес из адресной строки браузера и вставьте сюда.`,aiu_googleErrorPageHint:`Затем браузер покажет страницу ошибки («не удаётся открыть сайт») — так и должно быть. Google отправляет результат на ваш компьютер, где его никто не ждёт. Но в адресной строке результат входа есть — именно он здесь и нужен.`,aiu_addressLabel:`Адрес из браузера`,aiu_deviceStep1:`1. Откройте страницу OpenAI и введите этот код:`,aiu_copyCode:`Копировать код`,aiu_openPage:`Открыть страницу`,aiu_deviceWaiting:`Ожидание подтверждения — карточка обновится сама.`,aiu_openSignIn:`Открыть страницу входа`,aiu_copyLink:`Копировать ссылку`,aiu_redeem:`Активировать`,aiu_saveFirst:`Сначала сохраните настройки — затем можно начать вход.`,aiu_instanceNotRunning:`Экземпляр не запущен — запустите его для входа.`,aiu_noAnswer:`экземпляр не ответил`,aiu_noCredentials:`Данные доступа ИИ ещё не сохранены — добавьте их: Настройки → Учётные данные.`,aiu_adminKeyHint:`Этому аккаунту нужен АДМИНИСТРАТИВНЫЙ ключ организации, а не ключ ИИ-ассистента. Личные аккаунты без организации не выдают отчёты о расходе.`,aiu_stOnline:`В сети`,aiu_stLimited:`Ограничено`,aiu_stOffline:`Не в сети`},m={aiu_storedTitle:`Contas de IA`,aiu_storedHint:`Ative o que deseja monitorizar. As assinaturas iniciam sessão com a sua conta; as entradas abaixo vêm do armazenamento central de credenciais (Definições → Credenciais).`,aiu_capClaude:`Assinatura — inicie sessão uma vez com a sua conta Claude`,aiu_capChatgpt:`Assinatura — inicie sessão uma vez com a sua conta ChatGPT`,aiu_capGemini:`Assinatura — inicie sessão uma vez com a sua conta Google`,aiu_storedKey:`Chave guardada`,aiu_provider:`Fornecedor`,aiu_warnAt:`Avisar a partir de %`,aiu_signedIn:`Sessão iniciada`,aiu_signOut:`Terminar sessão`,aiu_startSignIn:`Iniciar sessão`,aiu_claudeStep1:`1. Abra a página de início de sessão e entre com a sua conta Claude.`,aiu_claudeStep2:`2. Copie o código mostrado e resgate-o aqui.`,aiu_codeLabel:`Código`,aiu_googleStep1:`1. Abra a página de início de sessão e entre com a sua conta Google.`,aiu_googleStep2:`2. Copie o endereço COMPLETO da barra de endereços e cole-o aqui.`,aiu_googleErrorPageHint:`O navegador mostrará depois uma página de erro («não é possível aceder») — isso é esperado. A Google envia o resultado para o seu computador, onde nada está à escuta. O endereço contém na mesma o resultado — e é isso que é preciso aqui.`,aiu_addressLabel:`Endereço do navegador`,aiu_deviceStep1:`1. Abra a página da OpenAI e introduza este código:`,aiu_copyCode:`Copiar código`,aiu_openPage:`Abrir página`,aiu_deviceWaiting:`À espera da sua confirmação — este cartão atualiza-se sozinho.`,aiu_openSignIn:`Abrir página de início de sessão`,aiu_copyLink:`Copiar link`,aiu_redeem:`Resgatar`,aiu_saveFirst:`Guarde primeiro as definições — depois o início de sessão pode começar.`,aiu_instanceNotRunning:`A instância não está em execução — inicie-a para entrar.`,aiu_noAnswer:`a instância não respondeu`,aiu_noCredentials:`Ainda não há credenciais de IA guardadas — adicione-as em Definições → Credenciais.`,aiu_adminKeyHint:`Esta conta precisa de uma chave de ADMINISTRAÇÃO da organização, não da chave do assistente de IA. Contas pessoais sem organização não fornecem relatórios de uso.`,aiu_stOnline:`Online`,aiu_stLimited:`Limitado`,aiu_stOffline:`Offline`},h={aiu_storedTitle:`AI-accounts`,aiu_storedHint:`Schakel in wat u wilt bewaken. Abonnementen melden zich aan met uw eigen account; de vermeldingen daaronder komen uit de centrale opslag van toegangsgegevens (Instellingen → Toegangsgegevens).`,aiu_capClaude:`Abonnement — meld u eenmalig aan met uw Claude-account`,aiu_capChatgpt:`Abonnement — meld u eenmalig aan met uw ChatGPT-account`,aiu_capGemini:`Abonnement — meld u eenmalig aan met uw Google-account`,aiu_storedKey:`Opgeslagen sleutel`,aiu_provider:`Aanbieder`,aiu_warnAt:`Waarschuwen vanaf %`,aiu_signedIn:`Aangemeld`,aiu_signOut:`Afmelden`,aiu_startSignIn:`Aanmelden`,aiu_claudeStep1:`1. Open de aanmeldpagina en log in met uw Claude-account.`,aiu_claudeStep2:`2. Kopieer de getoonde code en wissel die hier in.`,aiu_codeLabel:`Code`,aiu_googleStep1:`1. Open de aanmeldpagina en log in met uw Google-account.`,aiu_googleStep2:`2. Kopieer het VOLLEDIGE adres uit de adresbalk en plak het hier.`,aiu_googleErrorPageHint:`Uw browser toont daarna een foutpagina («site kan niet worden bereikt») — dat hoort zo. Google stuurt het resultaat naar uw eigen computer, waar niets luistert. In de adresbalk staat het resultaat wél — en dat is wat hier nodig is.`,aiu_addressLabel:`Adres uit de browser`,aiu_deviceStep1:`1. Open de OpenAI-pagina en typ deze code in:`,aiu_copyCode:`Code kopiëren`,aiu_openPage:`Pagina openen`,aiu_deviceWaiting:`Wachten op uw bevestiging — deze kaart werkt zichzelf bij.`,aiu_openSignIn:`Aanmeldpagina openen`,aiu_copyLink:`Link kopiëren`,aiu_redeem:`Inwisselen`,aiu_saveFirst:`Sla eerst de instellingen op — daarna kan het aanmelden starten.`,aiu_instanceNotRunning:`De instantie draait niet — start deze om aan te melden.`,aiu_noAnswer:`de instantie antwoordde niet`,aiu_noCredentials:`Nog geen AI-toegangsgegevens opgeslagen — voeg ze toe via Instellingen → Toegangsgegevens.`,aiu_adminKeyHint:`Dit account heeft een BEHEER-sleutel van uw organisatie nodig, niet die van de AI-assistent. Persoonlijke accounts zonder organisatie leveren geen verbruiksrapporten.`,aiu_stOnline:`Online`,aiu_stLimited:`Beperkt`,aiu_stOffline:`Offline`},g={aiu_storedTitle:`Comptes IA`,aiu_storedHint:`Activez ce que vous voulez surveiller. Les abonnements se connectent avec votre propre compte ; les entrées ci-dessous viennent du stockage central des identifiants (Réglages → Identifiants).`,aiu_capClaude:`Abonnement — connectez-vous une fois avec votre compte Claude`,aiu_capChatgpt:`Abonnement — connectez-vous une fois avec votre compte ChatGPT`,aiu_capGemini:`Abonnement — connectez-vous une fois avec votre compte Google`,aiu_storedKey:`Clé enregistrée`,aiu_provider:`Fournisseur`,aiu_warnAt:`Avertir à partir de %`,aiu_signedIn:`Connecté`,aiu_signOut:`Se déconnecter`,aiu_startSignIn:`Se connecter`,aiu_claudeStep1:`1. Ouvrez la page de connexion et connectez-vous avec votre compte Claude.`,aiu_claudeStep2:`2. Copiez le code affiché et validez-le ici.`,aiu_codeLabel:`Code`,aiu_googleStep1:`1. Ouvrez la page de connexion et connectez-vous avec votre compte Google.`,aiu_googleStep2:`2. Copiez l'adresse COMPLÈTE depuis la barre d'adresse et collez-la ici.`,aiu_googleErrorPageHint:`Votre navigateur affichera ensuite une page d'erreur (« site inaccessible ») — c'est normal. Google envoie le résultat vers votre propre ordinateur, où rien n'écoute. L'adresse contient malgré tout le résultat — et c'est précisément ce qu'il faut ici.`,aiu_addressLabel:`Adresse du navigateur`,aiu_deviceStep1:`1. Ouvrez la page OpenAI et saisissez ce code :`,aiu_copyCode:`Copier le code`,aiu_openPage:`Ouvrir la page`,aiu_deviceWaiting:`En attente de votre confirmation — cette carte se met à jour toute seule.`,aiu_openSignIn:`Ouvrir la page de connexion`,aiu_copyLink:`Copier le lien`,aiu_redeem:`Valider`,aiu_saveFirst:`Enregistrez d'abord les réglages — la connexion pourra ensuite démarrer.`,aiu_instanceNotRunning:`L'instance ne tourne pas — démarrez-la pour vous connecter.`,aiu_noAnswer:`l'instance n'a pas répondu`,aiu_noCredentials:`Aucun identifiant IA enregistré — ajoutez-les via Réglages → Identifiants.`,aiu_adminKeyHint:`Ce compte nécessite une clé d'ADMINISTRATION de votre organisation, pas celle de l'assistant IA. Les comptes personnels sans organisation ne fournissent pas de rapports d'utilisation.`,aiu_stOnline:`En ligne`,aiu_stLimited:`Limité`,aiu_stOffline:`Hors ligne`},_={aiu_storedTitle:`Account IA`,aiu_storedHint:`Attiva ciò che vuoi monitorare. Gli abbonamenti accedono con il tuo account; le voci sotto provengono dall'archivio centrale delle credenziali (Impostazioni → Credenziali).`,aiu_capClaude:`Abbonamento — accedi una volta con il tuo account Claude`,aiu_capChatgpt:`Abbonamento — accedi una volta con il tuo account ChatGPT`,aiu_capGemini:`Abbonamento — accedi una volta con il tuo account Google`,aiu_storedKey:`Chiave salvata`,aiu_provider:`Fornitore`,aiu_warnAt:`Avvisa da %`,aiu_signedIn:`Accesso effettuato`,aiu_signOut:`Disconnetti`,aiu_startSignIn:`Accedi`,aiu_claudeStep1:`1. Apri la pagina di accesso ed entra con il tuo account Claude.`,aiu_claudeStep2:`2. Copia il codice mostrato e riscattalo qui.`,aiu_codeLabel:`Codice`,aiu_googleStep1:`1. Apri la pagina di accesso ed entra con il tuo account Google.`,aiu_googleStep2:`2. Copia l'INTERO indirizzo dalla barra degli indirizzi e incollalo qui.`,aiu_googleErrorPageHint:`Il browser mostrerà poi una pagina di errore («sito non raggiungibile») — è corretto così. Google invia il risultato al tuo computer, dove nessuno è in ascolto. Nell'indirizzo il risultato c'è comunque — ed è proprio quello che serve qui.`,aiu_addressLabel:`Indirizzo dal browser`,aiu_deviceStep1:`1. Apri la pagina OpenAI e digita questo codice:`,aiu_copyCode:`Copia codice`,aiu_openPage:`Apri pagina`,aiu_deviceWaiting:`In attesa della tua conferma — questa scheda si aggiorna da sola.`,aiu_openSignIn:`Apri pagina di accesso`,aiu_copyLink:`Copia link`,aiu_redeem:`Riscatta`,aiu_saveFirst:`Salva prima le impostazioni — poi l'accesso può iniziare.`,aiu_instanceNotRunning:`L'istanza non è in esecuzione — avviala per accedere.`,aiu_noAnswer:`l'istanza non ha risposto`,aiu_noCredentials:`Nessuna credenziale IA salvata — aggiungila in Impostazioni → Credenziali.`,aiu_adminKeyHint:`Questo account richiede una chiave di AMMINISTRAZIONE della tua organizzazione, non quella dell'assistente IA. Gli account personali senza organizzazione non forniscono rapporti di utilizzo.`,aiu_stOnline:`Online`,aiu_stLimited:`Limitato`,aiu_stOffline:`Offline`},v={aiu_storedTitle:`Cuentas de IA`,aiu_storedHint:`Active lo que quiera supervisar. Las suscripciones inician sesión con su propia cuenta; las entradas de abajo provienen del almacén central de credenciales (Ajustes → Credenciales).`,aiu_capClaude:`Suscripción — inicie sesión una vez con su cuenta Claude`,aiu_capChatgpt:`Suscripción — inicie sesión una vez con su cuenta ChatGPT`,aiu_capGemini:`Suscripción — inicie sesión una vez con su cuenta Google`,aiu_storedKey:`Clave guardada`,aiu_provider:`Proveedor`,aiu_warnAt:`Avisar desde %`,aiu_signedIn:`Sesión iniciada`,aiu_signOut:`Cerrar sesión`,aiu_startSignIn:`Iniciar sesión`,aiu_claudeStep1:`1. Abra la página de inicio de sesión y entre con su cuenta Claude.`,aiu_claudeStep2:`2. Copie el código mostrado y canjéelo aquí.`,aiu_codeLabel:`Código`,aiu_googleStep1:`1. Abra la página de inicio de sesión y entre con su cuenta Google.`,aiu_googleStep2:`2. Copie la dirección COMPLETA de la barra de direcciones y péguela aquí.`,aiu_googleErrorPageHint:`Su navegador mostrará después una página de error («no se puede acceder al sitio») — es lo esperado. Google envía el resultado a su propio ordenador, donde nada está escuchando. La dirección contiene el resultado igualmente — y eso es lo que hace falta aquí.`,aiu_addressLabel:`Dirección del navegador`,aiu_deviceStep1:`1. Abra la página de OpenAI y escriba este código:`,aiu_copyCode:`Copiar código`,aiu_openPage:`Abrir página`,aiu_deviceWaiting:`Esperando su confirmación — esta tarjeta se actualiza sola.`,aiu_openSignIn:`Abrir página de inicio de sesión`,aiu_copyLink:`Copiar enlace`,aiu_redeem:`Canjear`,aiu_saveFirst:`Guarde primero la configuración — después puede comenzar el inicio de sesión.`,aiu_instanceNotRunning:`La instancia no está en marcha — iníciela para entrar.`,aiu_noAnswer:`la instancia no respondió`,aiu_noCredentials:`Aún no hay credenciales de IA guardadas — añádalas en Ajustes → Credenciales.`,aiu_adminKeyHint:`Esta cuenta necesita una clave de ADMINISTRACIÓN de su organización, no la del asistente de IA. Las cuentas personales sin organización no ofrecen informes de uso.`,aiu_stOnline:`En línea`,aiu_stLimited:`Limitado`,aiu_stOffline:`Sin conexión`},y={aiu_storedTitle:`Konta AI`,aiu_storedHint:`Włącz to, co ma być monitorowane. Subskrypcje logują się Twoim kontem; pozycje poniżej pochodzą z centralnego magazynu danych dostępu (Ustawienia → Dane dostępu).`,aiu_capClaude:`Subskrypcja — zaloguj się raz kontem Claude`,aiu_capChatgpt:`Subskrypcja — zaloguj się raz kontem ChatGPT`,aiu_capGemini:`Subskrypcja — zaloguj się raz kontem Google`,aiu_storedKey:`Zapisany klucz`,aiu_provider:`Dostawca`,aiu_warnAt:`Ostrzegaj od %`,aiu_signedIn:`Zalogowano`,aiu_signOut:`Wyloguj`,aiu_startSignIn:`Zaloguj`,aiu_claudeStep1:`1. Otwórz stronę logowania i zaloguj się kontem Claude.`,aiu_claudeStep2:`2. Skopiuj pokazany kod i zrealizuj go tutaj.`,aiu_codeLabel:`Kod`,aiu_googleStep1:`1. Otwórz stronę logowania i zaloguj się kontem Google.`,aiu_googleStep2:`2. Skopiuj CAŁY adres z paska adresu i wklej go tutaj.`,aiu_googleErrorPageHint:`Przeglądarka pokaże potem stronę błędu («nie można otworzyć strony») — tak ma być. Google wysyła wynik na Twój komputer, gdzie nic nie nasłuchuje. W pasku adresu wynik jednak jest — i właśnie on jest tu potrzebny.`,aiu_addressLabel:`Adres z przeglądarki`,aiu_deviceStep1:`1. Otwórz stronę OpenAI i wpisz ten kod:`,aiu_copyCode:`Kopiuj kod`,aiu_openPage:`Otwórz stronę`,aiu_deviceWaiting:`Czekam na potwierdzenie — ta karta odświeży się sama.`,aiu_openSignIn:`Otwórz stronę logowania`,aiu_copyLink:`Kopiuj link`,aiu_redeem:`Zrealizuj`,aiu_saveFirst:`Najpierw zapisz ustawienia — potem można rozpocząć logowanie.`,aiu_instanceNotRunning:`Instancja nie działa — uruchom ją, aby się zalogować.`,aiu_noAnswer:`instancja nie odpowiedziała`,aiu_noCredentials:`Brak zapisanych danych dostępu AI — dodaj je w Ustawienia → Dane dostępu.`,aiu_adminKeyHint:`To konto wymaga klucza ADMINISTRACYJNEGO organizacji, a nie klucza asystenta AI. Konta osobiste bez organizacji nie dostarczają raportów zużycia.`,aiu_stOnline:`Online`,aiu_stLimited:`Ograniczone`,aiu_stOffline:`Offline`},b={aiu_storedTitle:`Акаунти ШІ`,aiu_storedHint:`Увімкніть те, що треба відстежувати. Підписки входять під вашим акаунтом; записи нижче — з центрального сховища даних доступу (Налаштування → Дані доступу).`,aiu_capClaude:`Підписка — увійдіть один раз акаунтом Claude`,aiu_capChatgpt:`Підписка — увійдіть один раз акаунтом ChatGPT`,aiu_capGemini:`Підписка — увійдіть один раз акаунтом Google`,aiu_storedKey:`Збережений ключ`,aiu_provider:`Постачальник`,aiu_warnAt:`Попереджати від %`,aiu_signedIn:`Вхід виконано`,aiu_signOut:`Вийти`,aiu_startSignIn:`Увійти`,aiu_claudeStep1:`1. Відкрийте сторінку входу та увійдіть акаунтом Claude.`,aiu_claudeStep2:`2. Скопіюйте показаний код і активуйте його тут.`,aiu_codeLabel:`Код`,aiu_googleStep1:`1. Відкрийте сторінку входу та увійдіть акаунтом Google.`,aiu_googleStep2:`2. Скопіюйте ВЕСЬ адрес з адресного рядка та вставте сюди.`,aiu_googleErrorPageHint:`Далі браузер покаже сторінку помилки («сайт недоступний») — так і має бути. Google надсилає результат на ваш комп'ютер, де ніхто не слухає. В адресному рядку результат усе одно є — саме він тут і потрібен.`,aiu_addressLabel:`Адреса з браузера`,aiu_deviceStep1:`1. Відкрийте сторінку OpenAI та введіть цей код:`,aiu_copyCode:`Копіювати код`,aiu_openPage:`Відкрити сторінку`,aiu_deviceWaiting:`Очікую підтвердження — картка оновиться сама.`,aiu_openSignIn:`Відкрити сторінку входу`,aiu_copyLink:`Копіювати посилання`,aiu_redeem:`Активувати`,aiu_saveFirst:`Спочатку збережіть налаштування — потім можна починати вхід.`,aiu_instanceNotRunning:`Екземпляр не запущено — запустіть його для входу.`,aiu_noAnswer:`екземпляр не відповів`,aiu_noCredentials:`Ще немає збережених даних доступу ШІ — додайте їх у Налаштування → Дані доступу.`,aiu_adminKeyHint:`Цей акаунт потребує АДМІНІСТРАТИВНОГО ключа організації, а не ключа ШІ-асистента. Особисті акаунти без організації не дають звітів про використання.`,aiu_stOnline:`У мережі`,aiu_stLimited:`Обмежено`,aiu_stOffline:`Не в мережі`},x={aiu_storedTitle:`AI 账户`,aiu_storedHint:`开启需要监控的项目。订阅使用您自己的账户登录;下方条目来自管理界面的中央凭据存储(设置 → 凭据)。`,aiu_capClaude:`订阅——使用您的 Claude 账户登录一次`,aiu_capChatgpt:`订阅——使用您的 ChatGPT 账户登录一次`,aiu_capGemini:`订阅——使用您的 Google 账户登录一次`,aiu_storedKey:`已保存的密钥`,aiu_provider:`提供商`,aiu_warnAt:`警告阈值 %`,aiu_signedIn:`已登录`,aiu_signOut:`退出登录`,aiu_startSignIn:`登录`,aiu_claudeStep1:`1. 打开登录页面并使用您的 Claude 账户登录。`,aiu_claudeStep2:`2. 复制页面显示的代码并在此兑换。`,aiu_codeLabel:`代码`,aiu_googleStep1:`1. 打开登录页面并使用您的 Google 账户登录。`,aiu_googleStep2:`2. 复制浏览器地址栏中的完整地址并粘贴到这里。`,aiu_googleErrorPageHint:`随后浏览器会显示错误页面(无法访问此网站)——这是正常的。Google 把结果发送到您自己的电脑,而那里没有程序在接收。地址栏中仍然包含登录结果——这正是此处需要的。`,aiu_addressLabel:`来自浏览器的地址`,aiu_deviceStep1:`1. 打开 OpenAI 页面并输入此代码:`,aiu_copyCode:`复制代码`,aiu_openPage:`打开页面`,aiu_deviceWaiting:`正在等待您的确认——完成后此卡片会自动更新。`,aiu_openSignIn:`打开登录页面`,aiu_copyLink:`复制链接`,aiu_redeem:`兑换`,aiu_saveFirst:`请先保存设置——之后即可开始登录。`,aiu_instanceNotRunning:`实例未运行——请启动后再登录。`,aiu_noAnswer:`实例没有响应`,aiu_noCredentials:`尚未保存任何 AI 凭据——请在 设置 → 凭据 中添加。`,aiu_adminKeyHint:`此账户需要您所在组织的管理密钥,而不是管理界面 AI 助手使用的密钥。没有组织的个人账户无法提供用量报告。`,aiu_stOnline:`在线`,aiu_stLimited:`受限`,aiu_stOffline:`离线`},S=class extends t{constructor(e){super(e,{...e}),this.state={...this.state,data:{accounts:[]},originalData:{accounts:[]},theme:this.createTheme()};let t={en:d,de:f,ru:p,pt:m,nl:h,fr:g,it:_,es:v,pl:y,uk:b,"zh-cn":x};for(let[e,n]of Object.entries(t))o.extendTranslations(n,e);let n=(navigator.language||navigator.userLanguage||`en`).toLowerCase();o.setLanguage(n.startsWith(`zh`)?`zh-cn`:n.substring(0,2))}render(){return this.state.loaded?r(e,{injectFirst:!0,children:r(n,{theme:this.state.theme,children:r(s,{sx:{height:`100%`,bgcolor:`background.default`,color:`text.primary`},children:r(`div`,{style:{padding:50,width:760},children:r(u,{oContext:{adapterName:`ai-usage`,socket:this.socket,instance:0,themeType:this.state.theme.palette.mode,isFloatComma:!0,dateFormat:``,forceUpdate:()=>{},systemConfig:{},theme:this.state.theme,_themeName:this.state.themeName,onCommandRunning:()=>{}},alive:!0,changed:!1,themeName:this.state.theme.palette.mode,common:{},attr:`_accounts`,data:this.state.data,originalData:this.state.originalData,onError:()=>{},schema:{url:`custom/customComponents.js`,i18n:!0,name:`AiUsageComponentSet/Components/ConfigPanel`,type:`custom`},onChange:e=>this.setState({data:e})})})})})}):r(e,{injectFirst:!0,children:r(n,{theme:this.state.theme,children:r(c,{themeType:this.state.themeType})})})}};a(),window.adapterName=`ai-usage`;var C=document.getElementById(`root`);C&&l(C).render(r(i.StrictMode,{children:r(S,{socket:{port:8081}})}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-Wtw6jqAg.js";export{e as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./vite-preload-helper-B7qeedMF.js";import{a as t,r as n}from"./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-DEdJInQG.js";({...t.global});var r=t.share;t.utils,typeof __VUE_HMR_RUNTIME__>`u`&&(globalThis.__VUE_HMR_RUNTIME__={createRecord(){},rerender(){},reload(){}});var i=`__mf_init__virtual:mf:__mfe_internal__AiUsageComponentSet__mf_owner__1__mf_v__runtimeInit__mf_v__.js__`,a=globalThis[i];if(!a){let e,t,n=new Promise((n,r)=>{e=n,t=r});a=globalThis[i]={initPromise:n,initResolve:e,initReject:t}}var o=a.initResolve,s=`__mf_module_cache__`;globalThis[s]||={share:{},remote:{}},globalThis[s].share||={},globalThis[s].remote||={};var c=globalThis[s];for(let e of Object.keys(c.share))if(e.startsWith(`default:`)){let t=e.slice(8);c.share[t]===void 0&&(c.share[t]=c.share[e])}else if(!e.includes(`:`)){let t=`default:`+e;c.share[t]===void 0&&(c.share[t]=c.share[e])}var l={},u=Array.isArray(`default`)?`default`:[`default`],d=`default`,f=`AiUsageComponentSet`,p,m;async function h(e){for(let t=0;;t++)try{return await e()}catch(e){throw e}}var g=Symbol(`mf.originalSharedProvider`),_={emit:e=>e},v=(e,t)=>{if(t!==`version-first`)return e;let n={};for(let[t,r]of Object.entries(e))n[t]=Object.assign({},r,{[g]:r});return n},y=(e,t)=>{if(!t)return;let n=Object.entries(e||{}),r=n.find(([,e])=>e===t);if(r)return{version:r[0],provider:t,registered:!0};if(typeof t.version==`string`&&t.version)return{version:t.version,provider:t,registered:!1};let i=n.filter(([,e])=>e===t||!!(t.from&&(e==null?void 0:e.from)===t.from));if(i.length===1)return{version:i[0][0],provider:t,registered:!1}},b=(e,t,n,i)=>{var a;if(!e||!n)return;let o=Array.isArray(n.scope)?n.scope:[n.scope||`default`],s=v(e,i),c={};for(let e of o)c[e||`default`]={[t]:s};let l=(a=r.getRegisteredShare(c,t,{...n,scope:o,strategy:i},_))==null?void 0:a.shared;return(l==null?void 0:l[g])||l},x=(e,t,n,r)=>{var i;let a=e=>S(e,n),o=Object.fromEntries(Object.entries(e||{}).filter(([,e])=>!a(e)));n!=null&&n.version&&((i=n.shareConfig)==null?void 0:i.import)!==!1&&(o[n.version]||(o[n.version]=n));let s=b(o,t,n,r);return a(s)?void 0:s},S=(e,t)=>e===t||!!(t!=null&&t.from&&(e==null?void 0:e.from)===t.from),C=(e,t,n,r,i,a,o,s,c)=>{var l,u;if(c!==`version-first`||!s)return;let d=t==null||(l=t.options)==null||(l=l.shared)==null?void 0:l[i],f=Array.isArray(d)?d.find(e=>(e==null?void 0:e.version)===a):void 0,p=((s==null?void 0:s.from)===(t==null||(u=t.options)==null?void 0:u.name)?s:void 0)||(S(f,s)?f:t?void 0:s);if(p)return e.some(e=>{var i,a;return e!==t&&(e==null||(i=e.options)==null?void 0:i.name)===(o==null?void 0:o.from)&&(e==null||(a=e.shareScopeMap)==null?void 0:a[r])===n})?p:void 0},w=(e,t,n,r,i,a,o,s,c)=>{let l=a.registered?C(e,t,n,r,i,a.version,a.provider,s,c):void 0,u=l||o;if(u&&!(a.registered&&!S(u,s)))return{provider:u,scopeRootProvider:l}};async function T(){return p||=h(()=>e(()=>import(`./_virtual_mf-localSharedImportMap___mfe_internal__AiUsageComponentSet__mf_owner__1-DKcsNxEw.js`),[],import.meta.url)).catch(e=>{throw p=void 0,e}),p}async function E(){return m||=h(()=>e(()=>import(`./virtualExposes-B7ft9DTx.js`),[],import.meta.url)).then(e=>e.default??e).catch(e=>{throw m=void 0,e}),m}async function D(e={},t=[]){var r,i;let a=(e,t,n,r)=>{let i=(Array.isArray(r)?r[0]:r)||`default`,a=t||!n?e:e+`@`+n,o={canonical:i+`:`+a};return i==="default"&&(o.aliases=[a]),o},s=(e,t)=>{let n=e[t.canonical];if(n!==void 0)return n;let r=t.aliases||[];for(let n of r){if(!Object.prototype.hasOwnProperty.call(e,n))continue;let r=e[n];if(r!==void 0)return e[t.canonical]=r,r}},p=Symbol.for(`module-federation.shared-cache-listeners`),m=Symbol.for(`module-federation.shared-cache-owners`),g=e=>{let t=e[m];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,m,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},_=(e,t)=>{var n;return(n=e[m])==null?void 0:n[t.canonical]},v=(e,t,n,r)=>{var i;e[t.canonical]=n;let a=t.aliases||[];for(let t of a)Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0});let o=e[m];r===void 0?o&&delete o[t.canonical]:g(e)[t.canonical]=r;let s=(i=e[p])==null?void 0:i[t.canonical];if(s)for(let e of s)e(n);return n},C=Symbol.for(`module-federation.tree-shaking-shared-cache`),E=e=>{let t=e[C];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,C,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},D=(e,t,n,r)=>{if(!Array.isArray(n))return r;let i=[...new Set(n)].sort(),a=E(e),o=a[t.canonical]||=[],s=o.find(e=>e.providedExports.length===i.length&&e.providedExports.every((e,t)=>e===i[t]));return s?s.value=r:o.push({providedExports:i,value:r}),r},O=Symbol.for(`module-federation.tree-shaking-shared-selection-cache`),k=e=>{let t=e[O];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,O,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},A=(e,t,n)=>{var r;let i=s(e,t);return i===void 0?(r=e[O])==null||(r=r[t.canonical])==null?void 0:r[n]:i},j=(e,t,n,r)=>{let i=k(e),a=i[t.canonical]||=Object.create(null);return a[n]=r,r},M=((r=globalThis.__FEDERATION__)==null?void 0:r.__INSTANCES__)||[],N=(i=t.find(e=>e==null?void 0:e.from))==null?void 0:i.from,ee=M.find(t=>{var n,r;return(t==null||(n=t.options)==null?void 0:n.name)===N&&(t==null||(r=t.shareScopeMap)==null?void 0:r.default)===e})||M.find(t=>{var n,r;return(t==null||(n=t.options)==null?void 0:n.name)!==f&&(t==null||(r=t.shareScopeMap)==null?void 0:r.default)===e}),P=Object.create(null);for(let[t,n]of Object.entries(e)){let e=P[t]=Object.create(null);for(let[t,r]of Object.entries(n))e[t]=Object.assign({},r)}let{usedShared:F,usedRemotes:I}=await T();var L=l[d];if(L||=l[d]={from:f},t.indexOf(L)>=0)return;t.push(L);let R=e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(n.length>0&&n.some(e=>e!==void 0))break;t=e}return t},z=[],B=globalThis.window===void 0?await Promise.all([]):[],V=`__mf_vite_runtime_share_load_id__`,te=0,H=new Map,U=new Map,W=n({name:f,remotes:I,shared:F,plugins:[ne(),...z,...B],shareStrategy:`version-first`});W.initShareScopeMap(`default`,e);function ne(){return{name:`vite-share-pin-lifecycle-plugin`,resolveShare(e){var t;let n=(t=e.shareInfo)==null?void 0:t[V],r=n===void 0?void 0:U.get(n);if(!r)return e;let i=e.resolver;return e.resolver=(...e)=>(r.pinned.reapply(),i(...e)),r.pinned.reveal(),e}}}let re=W.sharedHandler.hooks.lifecycle.resolveShare,G=new WeakMap;re.on(e=>{var t;let n=(t=e.shareInfo)==null?void 0:t[V],r=e.resolver;return typeof r==`function`&&(e.resolver=(...e)=>{let t=r(...e),i=t==null?void 0:t.shared;return i&&(typeof i==`object`||typeof i==`function`)&&!G.has(i)&&G.set(i,{from:i.from}),n!==void 0&&i&&H.set(n,i),t}),e});let ie=(e,t,n,r)=>{if(!e||e[t]!==n)return;let i=Object.assign({},r,{version:r.version??t,scope:r.scope??(n==null?void 0:n.scope)??[`default`],strategy:`loaded-first`}),a=r.from;e[t]=i;let o=()=>n===void 0?e[t]===void 0:e[t]===n;return{provider:i,reveal(){return e[t]===i&&(n===void 0?delete e[t]:e[t]=n,!0)},reapply(){return o()?(e[t]=i,!0):!1},release(s,c=!0){return r.from=a,e[t]===i?c?s?(i.from=a,s&&i.lib&&(i.loaded=!0),r.strategy===void 0?delete i.strategy:i.strategy=r.strategy,!0):(n===void 0?delete e[t]:e[t]=n,!1):(n===void 0?delete e[t]:e[t]=n,!0):!c&&o()}}},ae=e=>Object.entries(e||{}).map(([e,t])=>({provider:t,version:e,from:t.from,registered:!0})),oe=(e,t)=>{if(t===void 0)return;let n;for(let r of e){let e=r.provider,i=e.treeShaking||e;if(r.loadedFactory===t||e.lib===t||i.lib===t){if(n)return;n=r}}return n},se=async(e,t,n)=>{let r=++te;U.set(r,{pinned:n});try{let n=await W.loadShare(e,{customShareInfo:{shareConfig:t,[V]:r}});return{factory:n===!1?void 0:n,selectedProvider:H.get(r)}}finally{H.delete(r),U.delete(r)}},K=async(e,t,n,r,i,a,o=!0)=>{let s=a.from,c=ie(n,r,i,a);if(!c)return;let l;try{l=await se(e,t,c)}catch(e){throw c.release(!1),e}let u=l==null?void 0:l.factory;if(u===void 0){c.release(!1);return}let d=ae(n),f=c.provider.treeShaking||c.provider,p=c.provider.lib===u||f.lib===u;if(!o&&p){let e=d.findIndex(e=>e.provider===c.provider);e!==-1&&d.splice(e,1)}!o&&!d.some(e=>e.provider===a)&&d.push({provider:a,version:r,from:s,registered:!1,loadedFactory:p?u:void 0});let m=!o&&l.selectedProvider===c.provider&&p?a:l.selectedProvider;if(m&&!d.some(e=>e.provider===m)){let e=G.get(m),t=typeof m.version==`string`&&m.version?m.version:r;d.push({provider:m,version:t,from:e?e.from:m.from,registered:(n==null?void 0:n[t])===m,loadedFactory:u})}let h=d.find(e=>e.provider===m)??oe(d,u);if(!c.release(!0,(h==null?void 0:h.provider)===c.provider)||!h)return;let g=G.get(h.provider);h.from=h.provider===a?s:g?g.from:h.provider.from,g&&(h.provider.from=g.from);let _=typeof u==`function`?u():u,v=await Promise.resolve(_);if(!(h.registered&&(n==null?void 0:n[h.version])!==h.provider))return{provider:h.provider,selection:h,resolved:v}},q=new Set,J=new Map,ce=async(t,n,r)=>{var i;let o=!!((i=n.shareConfig)!=null&&i.singleton);if(!o&&n.canLiveRebind!==!1)try{let i=x(r,t,n,`version-first`),l=y(r,i);if(!l)return;let{version:u}=l;if(!o&&u!==n.version||!i.lib&&!i.loading&&!(i.loaded&&typeof i.get==`function`))return;let d=a(t,o,n.version,n.scope);if(s(c.share,d)!==void 0)return;let f=e[t],p=f==null?void 0:f[u];if(l.registered&&!S(p,i))return;let m,h=i.lib;if(!h&&i.loading&&(h=await i.loading),!h&&i.loaded&&typeof i.get==`function`&&(h=await i.get()),!h)return;let g=typeof h==`function`?h():h,_=await Promise.resolve(g),b=l.registered?p:i;m={provider:b,selection:{provider:b,version:u,from:i.from,registered:l.registered},resolved:_};let C=m==null?void 0:m.provider,w=m==null?void 0:m.selection;if(!w)return;let T=m==null?void 0:m.resolved;if(T===void 0||s(c.share,d)!==void 0||w.registered&&(f==null?void 0:f[w.version])!==C)return;v(c.share,d,R(T),w.from),q.add(C)}catch(e){console.error(`[Module Federation] Failed to bridge materialized shared module "`+t+`"`,e)}},Y=async(t,n,r,i,o)=>{try{var l,u;let d=a(t,(l=n.shareConfig)==null?void 0:l.singleton,n.version,n.scope),p=s(c.share,d),m=_(c.share,d),h=x(r,t,n,`version-first`),g=h||b(r,t,n,`version-first`)||n,C=y(r,g);if(!C)return;let T=S(g,n),{version:E}=C,D=i==null?void 0:i[E],O=w(M,ee,e,`default`,t,C,h,D,`version-first`);if(!O&&!T)return;let{provider:k,scopeRootProvider:A}=O||{provider:g,scopeRootProvider:void 0};if(!((u=n.shareConfig)!=null&&u.singleton)||n.canLiveRebind===!1||p!==void 0&&m!==f)return;let j=e[t],N=j==null?void 0:j[E];if(C.registered&&!A&&!S(N,k))return;let P=await K(t,n.shareConfig,j,E,N,k,C.registered&&!T),F=P==null?void 0:P.provider,I=P==null?void 0:P.selection;if(!I||S(F,n)||o&&(o.version!==I.version||!S({from:I.from},o.provider))||q.has(F))return;let L=P==null?void 0:P.resolved;if(L===void 0)return;let z=s(c.share,d),B=_(c.share,d);if(z!==void 0&&B!==f||I.registered&&(j==null?void 0:j[I.version])!==F)return;o||J.set(t,{version:I.version,provider:{from:I.from}}),q.add(F);let V=R(L);v(c.share,d,V,I.from)}catch(e){console.error(`[Module Federation] Failed to bridge external shared module "`+t+`"`,e)}};for(let[e,t]of Object.entries(F))t.treeShaking||await ce(e,t,P[e]);for(let[e,t]of Object.entries(F)){var X;if(t.treeShaking)continue;let n=a(e,(X=t.shareConfig)==null?void 0:X.singleton,t.version,t.scope);if(s(c.share,n)!==void 0)continue;let r=a(e,!0,t.version,t.scope),i=s(c.share,r);i!==void 0&&v(c.share,n,i,_(c.share,r))}let Z=[`react`,`react/jsx-runtime`,`react-dom`,`react-dom/client`,`@mui/material`,`@mui/icons-material`,`@iobroker/gui-components`,`@iobroker/json-config`].filter(e=>F[e]!==void 0),Q=e=>e.startsWith(`@`)?e.split(`/`).slice(0,2).join(`/`):e.split(`/`)[0];for(let e of Object.keys(F)){if(Z.includes(e))continue;let t=Q(e),n=Z.indexOf(t);if(n===-1){Z.push(e);continue}let r=n;for(;r>0&&Q(Z[r-1])===t&&Z[r-1]!==t;)r--;Z.splice(r,0,e)}var le=async e=>{for(let r of e){var t,n;let e=F[r],i=a(r,(t=e.shareConfig)==null?void 0:t.singleton,e.version,e.scope);if(((n=e.shareConfig)==null?void 0:n.import)===!1||e.treeShaking||s(c.share,i)!==void 0)continue;let o=a(r,!0,e.version,e.scope),l=s(c.share,o);if(l!==void 0){v(c.share,i,l,_(c.share,o));continue}let u=await e.get(),d=typeof u==`function`?u():u,p=await Promise.resolve(d),m=(e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(n.length>0&&n.some(e=>e!==void 0))break;t=e}return t})(p),h=m===p?{...p}:m;h.__esModule!==!0&&Object.defineProperty(h,"__esModule",{value:!0,enumerable:!1}),v(c.share,i,h,f)}};let ue=e=>{var t,n;let r=F[e];if(!r.treeShaking&&((t=r.shareConfig)==null?void 0:t.import)!==!1)return!1;let i=a(e,(n=r.shareConfig)==null?void 0:n.singleton,r.version,r.scope);return r.treeShaking?A(c.share,i,f)===void 0&&s(c.share,i)===void 0:s(c.share,i)===void 0},$=Z.findIndex(e=>{var t,n,r;let i=F[e],o=a(e,(t=i.shareConfig)==null?void 0:t.singleton,i.version,i.scope);return(i.treeShaking?A(c.share,o,f)??s(c.share,o):s(c.share,o))===void 0?i.treeShaking||((n=i.shareConfig)==null?void 0:n.import)===!1?!0:!((r=i.shareConfig)!=null&&r.singleton)||typeof x!=`function`?!1:!!x(P[e],e,i,`version-first`):!1}),de=$===-1?Z:Z.slice(0,$);var fe=$===-1?[]:Z.slice($);await le(de);try{await h(async()=>{await Promise.all(await W.initializeSharing(`default`,{strategy:`version-first`,from:`build`,initScope:t}))})}catch(e){console.error(`[Module Federation]`,e)}for(let[t,n]of Object.entries(F))n.treeShaking||await Y(t,n,e[t],P[t],void 0);try{var pe;let e=(pe=globalThis.__FEDERATION__)==null?void 0:pe.__SHARE__,t=Object.create(null);if(e)for(let[,n]of Object.entries(e))for(let e of u){let r=n==null?void 0:n[e];if(r)for(let[e,n]of Object.entries(r)){let r=F==null?void 0:F[e],i=P[e],a=J.get(e);if(!r||!i||!a||r.treeShaking)continue;let o=t[e]||(t[e]=Object.create(null));for(let[e,t]of Object.entries(n)){if(!t.lib||a.version!==e||!S(t,a.provider))continue;let n=i[e];(t===n||n!=null&&n.from&&t.from===n.from)&&(t===r||r.from&&t.from===r.from||o[e]===void 0&&(o[e]=t))}}}for(let[e,n]of Object.entries(t))await Y(e,F[e],n,P[e],J.get(e))}catch(e){console.error(`[Module Federation] Failed to bridge external shared modules`,e)}let me=async()=>{},he=async(t,n)=>{var r,i;let o=a(t,(r=n.shareConfig)==null?void 0:r.singleton,n.version,n.scope),l=n.treeShaking?A(c.share,o,f):s(c.share,o);if(((i=n.shareConfig)==null?void 0:i.import)!==!1||l!==void 0)return;let u=e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(n.length>0&&n.some(e=>e!==void 0))break;t=e}return t},d=e==null?void 0:e[t],p=b(d,t,n,`version-first`)||n,m=y(d,p);if(!m)return;let{version:h}=m,g=d==null?void 0:d[h],_=await K(t,n.shareConfig,d,h,g,p,m.registered&&!S(p,n)),x=_==null?void 0:_.selection,C=_==null?void 0:_.provider,w=_==null?void 0:_.resolved;if(!x||S(C,n)||w===void 0||(n.treeShaking?A(c.share,o,f):s(c.share,o))!==void 0||x.registered&&(d==null?void 0:d[x.version])!==C)return;let T=u(w);if(n.treeShaking){let e=n.treeShaking.providedExports??n.treeShaking.usedExports??[];D(c.share,o,e,T),j(c.share,o,f,T)}else v(c.share,o,T,x.from)};for(let e of fe){let t=F[e];if(ue(e)){var ge;t.treeShaking?await me(e,t):((ge=t.shareConfig)==null?void 0:ge.import)===!1&&await he(e,t)}if(ue(e))break;await le([e])}return o(W),W}async function O(e){let t=await E();if(!(e in t))throw Error(`[Module Federation] Module ${e} does not exist in container.`);return c.pendingShareLoads&&await Promise.all(c.pendingShareLoads),t[e]().then(e=>()=>e)}export{D as n,O as t};
|
|
1
|
+
import{t as e}from"./vite-preload-helper-B7qeedMF.js";import{a as t,r as n}from"./_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-DEdJInQG.js";({...t.global});var r=t.share;t.utils,typeof __VUE_HMR_RUNTIME__>`u`&&(globalThis.__VUE_HMR_RUNTIME__={createRecord(){},rerender(){},reload(){}});var i=`__mf_init__virtual:mf:__mfe_internal__AiUsageComponentSet__mf_owner__1__mf_v__runtimeInit__mf_v__.js__`,a=globalThis[i];if(!a){let e,t,n=new Promise((n,r)=>{e=n,t=r});a=globalThis[i]={initPromise:n,initResolve:e,initReject:t}}var o=a.initResolve,s=`__mf_module_cache__`;globalThis[s]||={share:{},remote:{}},globalThis[s].share||={},globalThis[s].remote||={};var c=globalThis[s];for(let e of Object.keys(c.share))if(e.startsWith(`default:`)){let t=e.slice(8);c.share[t]===void 0&&(c.share[t]=c.share[e])}else if(!e.includes(`:`)){let t=`default:`+e;c.share[t]===void 0&&(c.share[t]=c.share[e])}var l={},u=Array.isArray(`default`)?`default`:[`default`],d=`default`,f=`AiUsageComponentSet`,p,m;async function h(e){for(let t=0;;t++)try{return await e()}catch(e){throw e}}var g=Symbol(`mf.originalSharedProvider`),_={emit:e=>e},v=(e,t)=>{if(t!==`version-first`)return e;let n={};for(let[t,r]of Object.entries(e))n[t]=Object.assign({},r,{[g]:r});return n},y=(e,t)=>{if(!t)return;let n=Object.entries(e||{}),r=n.find(([,e])=>e===t);if(r)return{version:r[0],provider:t,registered:!0};if(typeof t.version==`string`&&t.version)return{version:t.version,provider:t,registered:!1};let i=n.filter(([,e])=>e===t||!!(t.from&&(e==null?void 0:e.from)===t.from));if(i.length===1)return{version:i[0][0],provider:t,registered:!1}},b=(e,t,n,i)=>{var a;if(!e||!n)return;let o=Array.isArray(n.scope)?n.scope:[n.scope||`default`],s=v(e,i),c={};for(let e of o)c[e||`default`]={[t]:s};let l=(a=r.getRegisteredShare(c,t,{...n,scope:o,strategy:i},_))==null?void 0:a.shared;return(l==null?void 0:l[g])||l},x=(e,t,n,r)=>{var i;let a=e=>S(e,n),o=Object.fromEntries(Object.entries(e||{}).filter(([,e])=>!a(e)));n!=null&&n.version&&((i=n.shareConfig)==null?void 0:i.import)!==!1&&(o[n.version]||(o[n.version]=n));let s=b(o,t,n,r);return a(s)?void 0:s},S=(e,t)=>e===t||!!(t!=null&&t.from&&(e==null?void 0:e.from)===t.from),C=(e,t,n,r,i,a,o,s,c)=>{var l,u;if(c!==`version-first`||!s)return;let d=t==null||(l=t.options)==null||(l=l.shared)==null?void 0:l[i],f=Array.isArray(d)?d.find(e=>(e==null?void 0:e.version)===a):void 0,p=((s==null?void 0:s.from)===(t==null||(u=t.options)==null?void 0:u.name)?s:void 0)||(S(f,s)?f:t?void 0:s);if(p)return e.some(e=>{var i,a;return e!==t&&(e==null||(i=e.options)==null?void 0:i.name)===(o==null?void 0:o.from)&&(e==null||(a=e.shareScopeMap)==null?void 0:a[r])===n})?p:void 0},w=(e,t,n,r,i,a,o,s,c)=>{let l=a.registered?C(e,t,n,r,i,a.version,a.provider,s,c):void 0,u=l||o;if(u&&!(a.registered&&!S(u,s)))return{provider:u,scopeRootProvider:l}};async function T(){return p||=h(()=>e(()=>import(`./_virtual_mf-localSharedImportMap___mfe_internal__AiUsageComponentSet__mf_owner__1-DKcsNxEw.js`),[],import.meta.url)).catch(e=>{throw p=void 0,e}),p}async function E(){return m||=h(()=>e(()=>import(`./virtualExposes-CdmVMFlA.js`),[],import.meta.url)).then(e=>e.default??e).catch(e=>{throw m=void 0,e}),m}async function D(e={},t=[]){var r,i;let a=(e,t,n,r)=>{let i=(Array.isArray(r)?r[0]:r)||`default`,a=t||!n?e:e+`@`+n,o={canonical:i+`:`+a};return i==="default"&&(o.aliases=[a]),o},s=(e,t)=>{let n=e[t.canonical];if(n!==void 0)return n;let r=t.aliases||[];for(let n of r){if(!Object.prototype.hasOwnProperty.call(e,n))continue;let r=e[n];if(r!==void 0)return e[t.canonical]=r,r}},p=Symbol.for(`module-federation.shared-cache-listeners`),m=Symbol.for(`module-federation.shared-cache-owners`),g=e=>{let t=e[m];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,m,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},_=(e,t)=>{var n;return(n=e[m])==null?void 0:n[t.canonical]},v=(e,t,n,r)=>{var i;e[t.canonical]=n;let a=t.aliases||[];for(let t of a)Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0});let o=e[m];r===void 0?o&&delete o[t.canonical]:g(e)[t.canonical]=r;let s=(i=e[p])==null?void 0:i[t.canonical];if(s)for(let e of s)e(n);return n},C=Symbol.for(`module-federation.tree-shaking-shared-cache`),E=e=>{let t=e[C];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,C,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},D=(e,t,n,r)=>{if(!Array.isArray(n))return r;let i=[...new Set(n)].sort(),a=E(e),o=a[t.canonical]||=[],s=o.find(e=>e.providedExports.length===i.length&&e.providedExports.every((e,t)=>e===i[t]));return s?s.value=r:o.push({providedExports:i,value:r}),r},O=Symbol.for(`module-federation.tree-shaking-shared-selection-cache`),k=e=>{let t=e[O];return t===void 0&&(t=Object.create(null),Object.defineProperty(e,O,{value:t,enumerable:!1,configurable:!1,writable:!1})),t},A=(e,t,n)=>{var r;let i=s(e,t);return i===void 0?(r=e[O])==null||(r=r[t.canonical])==null?void 0:r[n]:i},j=(e,t,n,r)=>{let i=k(e),a=i[t.canonical]||=Object.create(null);return a[n]=r,r},M=((r=globalThis.__FEDERATION__)==null?void 0:r.__INSTANCES__)||[],N=(i=t.find(e=>e==null?void 0:e.from))==null?void 0:i.from,ee=M.find(t=>{var n,r;return(t==null||(n=t.options)==null?void 0:n.name)===N&&(t==null||(r=t.shareScopeMap)==null?void 0:r.default)===e})||M.find(t=>{var n,r;return(t==null||(n=t.options)==null?void 0:n.name)!==f&&(t==null||(r=t.shareScopeMap)==null?void 0:r.default)===e}),P=Object.create(null);for(let[t,n]of Object.entries(e)){let e=P[t]=Object.create(null);for(let[t,r]of Object.entries(n))e[t]=Object.assign({},r)}let{usedShared:F,usedRemotes:I}=await T();var L=l[d];if(L||=l[d]={from:f},t.indexOf(L)>=0)return;t.push(L);let R=e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(n.length>0&&n.some(e=>e!==void 0))break;t=e}return t},z=[],B=globalThis.window===void 0?await Promise.all([]):[],V=`__mf_vite_runtime_share_load_id__`,te=0,H=new Map,U=new Map,W=n({name:f,remotes:I,shared:F,plugins:[ne(),...z,...B],shareStrategy:`version-first`});W.initShareScopeMap(`default`,e);function ne(){return{name:`vite-share-pin-lifecycle-plugin`,resolveShare(e){var t;let n=(t=e.shareInfo)==null?void 0:t[V],r=n===void 0?void 0:U.get(n);if(!r)return e;let i=e.resolver;return e.resolver=(...e)=>(r.pinned.reapply(),i(...e)),r.pinned.reveal(),e}}}let re=W.sharedHandler.hooks.lifecycle.resolveShare,G=new WeakMap;re.on(e=>{var t;let n=(t=e.shareInfo)==null?void 0:t[V],r=e.resolver;return typeof r==`function`&&(e.resolver=(...e)=>{let t=r(...e),i=t==null?void 0:t.shared;return i&&(typeof i==`object`||typeof i==`function`)&&!G.has(i)&&G.set(i,{from:i.from}),n!==void 0&&i&&H.set(n,i),t}),e});let ie=(e,t,n,r)=>{if(!e||e[t]!==n)return;let i=Object.assign({},r,{version:r.version??t,scope:r.scope??(n==null?void 0:n.scope)??[`default`],strategy:`loaded-first`}),a=r.from;e[t]=i;let o=()=>n===void 0?e[t]===void 0:e[t]===n;return{provider:i,reveal(){return e[t]===i&&(n===void 0?delete e[t]:e[t]=n,!0)},reapply(){return o()?(e[t]=i,!0):!1},release(s,c=!0){return r.from=a,e[t]===i?c?s?(i.from=a,s&&i.lib&&(i.loaded=!0),r.strategy===void 0?delete i.strategy:i.strategy=r.strategy,!0):(n===void 0?delete e[t]:e[t]=n,!1):(n===void 0?delete e[t]:e[t]=n,!0):!c&&o()}}},ae=e=>Object.entries(e||{}).map(([e,t])=>({provider:t,version:e,from:t.from,registered:!0})),oe=(e,t)=>{if(t===void 0)return;let n;for(let r of e){let e=r.provider,i=e.treeShaking||e;if(r.loadedFactory===t||e.lib===t||i.lib===t){if(n)return;n=r}}return n},se=async(e,t,n)=>{let r=++te;U.set(r,{pinned:n});try{let n=await W.loadShare(e,{customShareInfo:{shareConfig:t,[V]:r}});return{factory:n===!1?void 0:n,selectedProvider:H.get(r)}}finally{H.delete(r),U.delete(r)}},K=async(e,t,n,r,i,a,o=!0)=>{let s=a.from,c=ie(n,r,i,a);if(!c)return;let l;try{l=await se(e,t,c)}catch(e){throw c.release(!1),e}let u=l==null?void 0:l.factory;if(u===void 0){c.release(!1);return}let d=ae(n),f=c.provider.treeShaking||c.provider,p=c.provider.lib===u||f.lib===u;if(!o&&p){let e=d.findIndex(e=>e.provider===c.provider);e!==-1&&d.splice(e,1)}!o&&!d.some(e=>e.provider===a)&&d.push({provider:a,version:r,from:s,registered:!1,loadedFactory:p?u:void 0});let m=!o&&l.selectedProvider===c.provider&&p?a:l.selectedProvider;if(m&&!d.some(e=>e.provider===m)){let e=G.get(m),t=typeof m.version==`string`&&m.version?m.version:r;d.push({provider:m,version:t,from:e?e.from:m.from,registered:(n==null?void 0:n[t])===m,loadedFactory:u})}let h=d.find(e=>e.provider===m)??oe(d,u);if(!c.release(!0,(h==null?void 0:h.provider)===c.provider)||!h)return;let g=G.get(h.provider);h.from=h.provider===a?s:g?g.from:h.provider.from,g&&(h.provider.from=g.from);let _=typeof u==`function`?u():u,v=await Promise.resolve(_);if(!(h.registered&&(n==null?void 0:n[h.version])!==h.provider))return{provider:h.provider,selection:h,resolved:v}},q=new Set,J=new Map,ce=async(t,n,r)=>{var i;let o=!!((i=n.shareConfig)!=null&&i.singleton);if(!o&&n.canLiveRebind!==!1)try{let i=x(r,t,n,`version-first`),l=y(r,i);if(!l)return;let{version:u}=l;if(!o&&u!==n.version||!i.lib&&!i.loading&&!(i.loaded&&typeof i.get==`function`))return;let d=a(t,o,n.version,n.scope);if(s(c.share,d)!==void 0)return;let f=e[t],p=f==null?void 0:f[u];if(l.registered&&!S(p,i))return;let m,h=i.lib;if(!h&&i.loading&&(h=await i.loading),!h&&i.loaded&&typeof i.get==`function`&&(h=await i.get()),!h)return;let g=typeof h==`function`?h():h,_=await Promise.resolve(g),b=l.registered?p:i;m={provider:b,selection:{provider:b,version:u,from:i.from,registered:l.registered},resolved:_};let C=m==null?void 0:m.provider,w=m==null?void 0:m.selection;if(!w)return;let T=m==null?void 0:m.resolved;if(T===void 0||s(c.share,d)!==void 0||w.registered&&(f==null?void 0:f[w.version])!==C)return;v(c.share,d,R(T),w.from),q.add(C)}catch(e){console.error(`[Module Federation] Failed to bridge materialized shared module "`+t+`"`,e)}},Y=async(t,n,r,i,o)=>{try{var l,u;let d=a(t,(l=n.shareConfig)==null?void 0:l.singleton,n.version,n.scope),p=s(c.share,d),m=_(c.share,d),h=x(r,t,n,`version-first`),g=h||b(r,t,n,`version-first`)||n,C=y(r,g);if(!C)return;let T=S(g,n),{version:E}=C,D=i==null?void 0:i[E],O=w(M,ee,e,`default`,t,C,h,D,`version-first`);if(!O&&!T)return;let{provider:k,scopeRootProvider:A}=O||{provider:g,scopeRootProvider:void 0};if(!((u=n.shareConfig)!=null&&u.singleton)||n.canLiveRebind===!1||p!==void 0&&m!==f)return;let j=e[t],N=j==null?void 0:j[E];if(C.registered&&!A&&!S(N,k))return;let P=await K(t,n.shareConfig,j,E,N,k,C.registered&&!T),F=P==null?void 0:P.provider,I=P==null?void 0:P.selection;if(!I||S(F,n)||o&&(o.version!==I.version||!S({from:I.from},o.provider))||q.has(F))return;let L=P==null?void 0:P.resolved;if(L===void 0)return;let z=s(c.share,d),B=_(c.share,d);if(z!==void 0&&B!==f||I.registered&&(j==null?void 0:j[I.version])!==F)return;o||J.set(t,{version:I.version,provider:{from:I.from}}),q.add(F);let V=R(L);v(c.share,d,V,I.from)}catch(e){console.error(`[Module Federation] Failed to bridge external shared module "`+t+`"`,e)}};for(let[e,t]of Object.entries(F))t.treeShaking||await ce(e,t,P[e]);for(let[e,t]of Object.entries(F)){var X;if(t.treeShaking)continue;let n=a(e,(X=t.shareConfig)==null?void 0:X.singleton,t.version,t.scope);if(s(c.share,n)!==void 0)continue;let r=a(e,!0,t.version,t.scope),i=s(c.share,r);i!==void 0&&v(c.share,n,i,_(c.share,r))}let Z=[`react`,`react/jsx-runtime`,`react-dom`,`react-dom/client`,`@mui/material`,`@mui/icons-material`,`@iobroker/gui-components`,`@iobroker/json-config`].filter(e=>F[e]!==void 0),Q=e=>e.startsWith(`@`)?e.split(`/`).slice(0,2).join(`/`):e.split(`/`)[0];for(let e of Object.keys(F)){if(Z.includes(e))continue;let t=Q(e),n=Z.indexOf(t);if(n===-1){Z.push(e);continue}let r=n;for(;r>0&&Q(Z[r-1])===t&&Z[r-1]!==t;)r--;Z.splice(r,0,e)}var le=async e=>{for(let r of e){var t,n;let e=F[r],i=a(r,(t=e.shareConfig)==null?void 0:t.singleton,e.version,e.scope);if(((n=e.shareConfig)==null?void 0:n.import)===!1||e.treeShaking||s(c.share,i)!==void 0)continue;let o=a(r,!0,e.version,e.scope),l=s(c.share,o);if(l!==void 0){v(c.share,i,l,_(c.share,o));continue}let u=await e.get(),d=typeof u==`function`?u():u,p=await Promise.resolve(d),m=(e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(n.length>0&&n.some(e=>e!==void 0))break;t=e}return t})(p),h=m===p?{...p}:m;h.__esModule!==!0&&Object.defineProperty(h,"__esModule",{value:!0,enumerable:!1}),v(c.share,i,h,f)}};let ue=e=>{var t,n;let r=F[e];if(!r.treeShaking&&((t=r.shareConfig)==null?void 0:t.import)!==!1)return!1;let i=a(e,(n=r.shareConfig)==null?void 0:n.singleton,r.version,r.scope);return r.treeShaking?A(c.share,i,f)===void 0&&s(c.share,i)===void 0:s(c.share,i)===void 0},$=Z.findIndex(e=>{var t,n,r;let i=F[e],o=a(e,(t=i.shareConfig)==null?void 0:t.singleton,i.version,i.scope);return(i.treeShaking?A(c.share,o,f)??s(c.share,o):s(c.share,o))===void 0?i.treeShaking||((n=i.shareConfig)==null?void 0:n.import)===!1?!0:!((r=i.shareConfig)!=null&&r.singleton)||typeof x!=`function`?!1:!!x(P[e],e,i,`version-first`):!1}),de=$===-1?Z:Z.slice(0,$);var fe=$===-1?[]:Z.slice($);await le(de);try{await h(async()=>{await Promise.all(await W.initializeSharing(`default`,{strategy:`version-first`,from:`build`,initScope:t}))})}catch(e){console.error(`[Module Federation]`,e)}for(let[t,n]of Object.entries(F))n.treeShaking||await Y(t,n,e[t],P[t],void 0);try{var pe;let e=(pe=globalThis.__FEDERATION__)==null?void 0:pe.__SHARE__,t=Object.create(null);if(e)for(let[,n]of Object.entries(e))for(let e of u){let r=n==null?void 0:n[e];if(r)for(let[e,n]of Object.entries(r)){let r=F==null?void 0:F[e],i=P[e],a=J.get(e);if(!r||!i||!a||r.treeShaking)continue;let o=t[e]||(t[e]=Object.create(null));for(let[e,t]of Object.entries(n)){if(!t.lib||a.version!==e||!S(t,a.provider))continue;let n=i[e];(t===n||n!=null&&n.from&&t.from===n.from)&&(t===r||r.from&&t.from===r.from||o[e]===void 0&&(o[e]=t))}}}for(let[e,n]of Object.entries(t))await Y(e,F[e],n,P[e],J.get(e))}catch(e){console.error(`[Module Federation] Failed to bridge external shared modules`,e)}let me=async()=>{},he=async(t,n)=>{var r,i;let o=a(t,(r=n.shareConfig)==null?void 0:r.singleton,n.version,n.scope),l=n.treeShaking?A(c.share,o,f):s(c.share,o);if(((i=n.shareConfig)==null?void 0:i.import)!==!1||l!==void 0)return;let u=e=>{let t=e;for(let e=0;e<5;e++){let e=t==null?void 0:t.default;if(!e||typeof e!=`object`||Object.keys(e).length===0)break;let n=Object.keys(t).filter(e=>e!=="default").map(e=>t[e]);if(n.length>0&&n.some(e=>e!==void 0))break;t=e}return t},d=e==null?void 0:e[t],p=b(d,t,n,`version-first`)||n,m=y(d,p);if(!m)return;let{version:h}=m,g=d==null?void 0:d[h],_=await K(t,n.shareConfig,d,h,g,p,m.registered&&!S(p,n)),x=_==null?void 0:_.selection,C=_==null?void 0:_.provider,w=_==null?void 0:_.resolved;if(!x||S(C,n)||w===void 0||(n.treeShaking?A(c.share,o,f):s(c.share,o))!==void 0||x.registered&&(d==null?void 0:d[x.version])!==C)return;let T=u(w);if(n.treeShaking){let e=n.treeShaking.providedExports??n.treeShaking.usedExports??[];D(c.share,o,e,T),j(c.share,o,f,T)}else v(c.share,o,T,x.from)};for(let e of fe){let t=F[e];if(ue(e)){var ge;t.treeShaking?await me(e,t):((ge=t.shareConfig)==null?void 0:ge.import)===!1&&await he(e,t)}if(ue(e))break;await le([e])}return o(W),W}async function O(e){let t=await E();if(!(e in t))throw Error(`[Module Federation] Module ${e} does not exist in container.`);return c.pendingShareLoads&&await Promise.all(c.pendingShareLoads),t[e]().then(e=>()=>e)}export{D as n,O as t};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./Components-C4wFRka3.js","./ConfigPanel-CGCj6Crq.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{t as e}from"./vite-preload-helper-B7qeedMF.js";var t={"./Components":async()=>{let t=await e(()=>import(`./Components-C4wFRka3.js`),__vite__mapDeps([0,1]),import.meta.url),n={};return Object.assign(n,t),Object.defineProperty(n,"__esModule",{value:!0,enumerable:!1}),n}};export{t as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./Components-
|
|
2
|
-
import{t as e}from"./vite-preload-helper-B7qeedMF.js";var t={},n=new Set,r=Promise.resolve();async function i(e){let t=r.then(e,e);return r=t.then(()=>void 0,()=>void 0),t}async function a(e){if(typeof document>`u`)return;let r=t[e]||[];await Promise.all(r.map(e=>{let t=new URL(e,import.meta.url).href;return n.has(t)||(n.add(t),document.querySelector(`link[rel="stylesheet"][href="${t}"]`))?Promise.resolve():new Promise((e,n)=>{let r=document.createElement(`link`);r.rel=`stylesheet`,r.href=t,r.onload=()=>e(),r.onerror=()=>n(Error(`[Module Federation] Failed to load CSS asset: ${t}`)),document.head.appendChild(r)})}))}var o={"./Components":async()=>{await a(`./Components`),await Promise.all([]);let t=await i(()=>e(()=>import(`./Components-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./Components-C4wFRka3.js","./ConfigPanel-CGCj6Crq.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{t as e}from"./vite-preload-helper-B7qeedMF.js";var t={},n=new Set,r=Promise.resolve();async function i(e){let t=r.then(e,e);return r=t.then(()=>void 0,()=>void 0),t}async function a(e){if(typeof document>`u`)return;let r=t[e]||[];await Promise.all(r.map(e=>{let t=new URL(e,import.meta.url).href;return n.has(t)||(n.add(t),document.querySelector(`link[rel="stylesheet"][href="${t}"]`))?Promise.resolve():new Promise((e,n)=>{let r=document.createElement(`link`);r.rel=`stylesheet`,r.href=t,r.onload=()=>e(),r.onerror=()=>n(Error(`[Module Federation] Failed to load CSS asset: ${t}`)),document.head.appendChild(r)})}))}var o={"./Components":async()=>{await a(`./Components`),await Promise.all([]);let t=await i(()=>e(()=>import(`./Components-C4wFRka3.js`),__vite__mapDeps([0,1]),import.meta.url)),n=t&&t.__mf_remote_dependency_pending;n&&typeof n.then==`function`&&await n;let r={};return Object.assign(r,t),Object.defineProperty(r,"__esModule",{value:!0,enumerable:!1}),r}};export{o as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{n as e,t}from"./assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-
|
|
1
|
+
import{n as e,t}from"./assets/virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-BjDe1IXR.js";export{t as get,e as init};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"id":"AiUsageComponentSet","name":"AiUsageComponentSet","metaData":{"name":"AiUsageComponentSet","type":"app","buildInfo":{"buildVersion":"1.0.0","buildName":"AiUsageComponentSet"},"remoteEntry":{"name":"customComponents.js","path":"","type":"module"},"ssrRemoteEntry":{"name":"customComponents.ssr.js","path":"","type":"module"},"types":{"path":"","name":"","zip":"@mf-types.zip","api":"@mf-types.d.ts"},"globalName":"AiUsageComponentSet","pluginVersion":"0.2.5","publicPath":"auto"},"shared":[{"id":"AiUsageComponentSet:@iobroker/gui-components","name":"@iobroker/gui-components","version":"10.1.0","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__prebuild___mf_0_iobroker_mf_1_gui_mf_2_components__prebuild__-DeLUTSLT.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:@iobroker/json-config","name":"@iobroker/json-config","version":"9.0.22","singleton":true,"requiredVersion":"*","assets":{"js":{"async":["assets/lib-MY71LxhX.js"],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-DEdJInQG.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:@mui/icons-material","name":"@mui/icons-material","version":"9.3.1","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:@mui/material","name":"@mui/material","version":"9.3.1","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:react","name":"react","version":"19.2.8","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:react-dom","name":"react-dom","version":"19.2.8","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:react/jsx-runtime","name":"react/jsx-runtime","version":"19.2.8","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:react-dom/client","name":"react-dom/client","version":"19.2.8","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-CFn_lBXc.js"]},"css":{"async":[],"sync":[]}}}],"remotes":[],"exposes":[{"id":"AiUsageComponentSet:Components","name":"Components","assets":{"js":{"async":["assets/lib-MY71LxhX.js"],"sync":["assets/Components-
|
|
1
|
+
{"id":"AiUsageComponentSet","name":"AiUsageComponentSet","metaData":{"name":"AiUsageComponentSet","type":"app","buildInfo":{"buildVersion":"1.0.0","buildName":"AiUsageComponentSet"},"remoteEntry":{"name":"customComponents.js","path":"","type":"module"},"ssrRemoteEntry":{"name":"customComponents.ssr.js","path":"","type":"module"},"types":{"path":"","name":"","zip":"@mf-types.zip","api":"@mf-types.d.ts"},"globalName":"AiUsageComponentSet","pluginVersion":"0.2.5","publicPath":"auto"},"shared":[{"id":"AiUsageComponentSet:@iobroker/gui-components","name":"@iobroker/gui-components","version":"10.1.0","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__prebuild___mf_0_iobroker_mf_1_gui_mf_2_components__prebuild__-DeLUTSLT.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:@iobroker/json-config","name":"@iobroker/json-config","version":"9.0.22","singleton":true,"requiredVersion":"*","assets":{"js":{"async":["assets/lib-MY71LxhX.js"],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_json_mf_2_config__loadShare__.js-DEdJInQG.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:@mui/icons-material","name":"@mui/icons-material","version":"9.3.1","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:@mui/material","name":"@mui/material","version":"9.3.1","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:react","name":"react","version":"19.2.8","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:react-dom","name":"react-dom","version":"19.2.8","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:react/jsx-runtime","name":"react/jsx-runtime","version":"19.2.8","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare___mf_0_iobroker_mf_1_gui_mf_2_components__loadShare__.js-DzPBJWNQ.js"]},"css":{"async":[],"sync":[]}}},{"id":"AiUsageComponentSet:react-dom/client","name":"react-dom/client","version":"19.2.8","singleton":true,"requiredVersion":"*","assets":{"js":{"async":[],"sync":["assets/_virtual_mf___mfe_internal__AiUsageComponentSet__mf_owner__1__loadShare__react_mf_2_dom_mf_1_client__loadShare__.js-CFn_lBXc.js"]},"css":{"async":[],"sync":[]}}}],"remotes":[],"exposes":[{"id":"AiUsageComponentSet:Components","name":"Components","assets":{"js":{"async":["assets/lib-MY71LxhX.js"],"sync":["assets/Components-C4wFRka3.js"]},"css":{"async":[],"sync":[]}},"path":"./Components"}]}
|
package/build/lib/http.js
CHANGED
|
@@ -25,14 +25,14 @@ __export(http_exports, {
|
|
|
25
25
|
module.exports = __toCommonJS(http_exports);
|
|
26
26
|
var import_provider = require("./provider");
|
|
27
27
|
const REQUEST_TIMEOUT_MS = 15e3;
|
|
28
|
-
async function
|
|
28
|
+
async function request(url, init, authOn400 = false) {
|
|
29
29
|
let response;
|
|
30
30
|
try {
|
|
31
|
-
response = await fetch(url, {
|
|
31
|
+
response = await fetch(url, { ...init, signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS) });
|
|
32
32
|
} catch (e) {
|
|
33
33
|
throw new import_provider.FetchError("network", e instanceof Error ? e.message : String(e));
|
|
34
34
|
}
|
|
35
|
-
if (response.status === 401 || response.status === 403) {
|
|
35
|
+
if (response.status === 401 || response.status === 403 || authOn400 && response.status === 400) {
|
|
36
36
|
throw new import_provider.FetchError("auth", `HTTP ${response.status}`);
|
|
37
37
|
}
|
|
38
38
|
if (response.status === 429) {
|
|
@@ -43,63 +43,30 @@ async function getJson(url, headers) {
|
|
|
43
43
|
}
|
|
44
44
|
try {
|
|
45
45
|
return await response.json();
|
|
46
|
-
} catch {
|
|
47
|
-
throw new import_provider.FetchError("service",
|
|
46
|
+
} catch (e) {
|
|
47
|
+
throw new import_provider.FetchError("service", `invalid JSON: ${e instanceof Error ? e.message : String(e)}`);
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
+
async function getJson(url, headers) {
|
|
51
|
+
return request(url, { headers });
|
|
52
|
+
}
|
|
50
53
|
async function postJson(url, body) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
body: JSON.stringify(body),
|
|
57
|
-
signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS)
|
|
58
|
-
});
|
|
59
|
-
} catch (e) {
|
|
60
|
-
throw new import_provider.FetchError("network", e instanceof Error ? e.message : String(e));
|
|
61
|
-
}
|
|
62
|
-
if (response.status === 401 || response.status === 403 || response.status === 400) {
|
|
63
|
-
throw new import_provider.FetchError("auth", `HTTP ${response.status}`);
|
|
64
|
-
}
|
|
65
|
-
if (response.status === 429) {
|
|
66
|
-
throw new import_provider.FetchError("rate-limit", "HTTP 429");
|
|
67
|
-
}
|
|
68
|
-
if (!response.ok) {
|
|
69
|
-
throw new import_provider.FetchError("service", `HTTP ${response.status}`);
|
|
70
|
-
}
|
|
71
|
-
try {
|
|
72
|
-
return await response.json();
|
|
73
|
-
} catch {
|
|
74
|
-
throw new import_provider.FetchError("service", "invalid JSON response");
|
|
75
|
-
}
|
|
54
|
+
return request(
|
|
55
|
+
url,
|
|
56
|
+
{ method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(body) },
|
|
57
|
+
true
|
|
58
|
+
);
|
|
76
59
|
}
|
|
77
60
|
async function postForm(url, form, headers = {}) {
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
61
|
+
return request(
|
|
62
|
+
url,
|
|
63
|
+
{
|
|
81
64
|
method: "POST",
|
|
82
65
|
headers: { "Content-Type": "application/x-www-form-urlencoded", ...headers },
|
|
83
|
-
body: new URLSearchParams(form).toString()
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
throw new import_provider.FetchError("network", e instanceof Error ? e.message : String(e));
|
|
88
|
-
}
|
|
89
|
-
if (response.status === 400 || response.status === 401 || response.status === 403) {
|
|
90
|
-
throw new import_provider.FetchError("auth", `HTTP ${response.status}`);
|
|
91
|
-
}
|
|
92
|
-
if (response.status === 429) {
|
|
93
|
-
throw new import_provider.FetchError("rate-limit", "HTTP 429");
|
|
94
|
-
}
|
|
95
|
-
if (!response.ok) {
|
|
96
|
-
throw new import_provider.FetchError("service", `HTTP ${response.status}`);
|
|
97
|
-
}
|
|
98
|
-
try {
|
|
99
|
-
return await response.json();
|
|
100
|
-
} catch (e) {
|
|
101
|
-
throw new import_provider.FetchError("service", `invalid JSON: ${e instanceof Error ? e.message : String(e)}`);
|
|
102
|
-
}
|
|
66
|
+
body: new URLSearchParams(form).toString()
|
|
67
|
+
},
|
|
68
|
+
true
|
|
69
|
+
);
|
|
103
70
|
}
|
|
104
71
|
// Annotate the CommonJS export names for ESM import in node:
|
|
105
72
|
0 && (module.exports = {
|
package/build/lib/http.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/lib/http.ts"],
|
|
4
|
-
"sourcesContent": ["import { FetchError } from \"./provider\";\n\n/** Per-request timeout (ms). */\nconst REQUEST_TIMEOUT_MS = 15000;\n\n/** The JSON-GET seam the provider modules use \u2014 injectable for tests. */\nexport type JsonFetch = (url: string, headers: Record<string, string>) => Promise<unknown>;\n\n/**\n *
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAA2B;AAG3B,MAAM,qBAAqB;
|
|
4
|
+
"sourcesContent": ["import { FetchError } from \"./provider\";\n\n/** Per-request timeout (ms). */\nconst REQUEST_TIMEOUT_MS = 15000;\n\n/** The JSON-GET seam the provider modules use \u2014 injectable for tests. */\nexport type JsonFetch = (url: string, headers: Record<string, string>) => Promise<unknown>;\n\n/**\n * Run one request and turn its outcome into the shared failure classification:\n * 401/403 (and 400 where the provider answers a rejected grant that way) become an\n * auth error, 429 a rate-limit error, any other bad status or unparsable body a\n * SERVICE error (the service answered and is broken), and only a throw \u2014 refused\n * connection, DNS failure, timeout \u2014 a network error. The poll engine turns that\n * split into \"the AI service is down\" versus \"this host has no connection\".\n *\n * @param url the request URL\n * @param init the request options (method, headers, body)\n * @param authOn400 true when a 400 means a rejected grant rather than a service fault\n * @returns the parsed JSON body\n */\nasync function request(url: string, init: RequestInit, authOn400 = false): Promise<unknown> {\n let response: Response;\n try {\n response = await fetch(url, { ...init, signal: AbortSignal.timeout(REQUEST_TIMEOUT_MS) });\n } catch (e) {\n throw new FetchError(\"network\", e instanceof Error ? e.message : String(e));\n }\n if (response.status === 401 || response.status === 403 || (authOn400 && response.status === 400)) {\n throw new FetchError(\"auth\", `HTTP ${response.status}`);\n }\n if (response.status === 429) {\n throw new FetchError(\"rate-limit\", \"HTTP 429\");\n }\n if (!response.ok) {\n // 5xx = the service answered and is broken; anything else unexpected is treated\n // the same way, because the service DID answer \u2014 only a throw above means we\n // never reached it.\n throw new FetchError(\"service\", `HTTP ${response.status}`);\n }\n try {\n return await response.json();\n } catch (e) {\n throw new FetchError(\"service\", `invalid JSON: ${e instanceof Error ? e.message : String(e)}`);\n }\n}\n\n/**\n * GET a JSON document.\n *\n * @param url the request URL\n * @param headers request headers (Authorization etc.)\n * @returns the parsed JSON body\n */\nexport async function getJson(url: string, headers: Record<string, string>): Promise<unknown> {\n return request(url, { headers });\n}\n\n/**\n * POST a JSON document. A 400 counts as an auth failure here: the OAuth token\n * endpoints answer a dead code or refresh token with exactly that.\n *\n * @param url the request URL\n * @param body the JSON body\n * @returns the parsed JSON response\n */\nexport async function postJson(url: string, body: Record<string, unknown>): Promise<unknown> {\n return request(\n url,\n { method: \"POST\", headers: { \"Content-Type\": \"application/json\" }, body: JSON.stringify(body) },\n true,\n );\n}\n\n/**\n * POST a form-encoded body and return the parsed JSON answer.\n *\n * OAuth code redemption uses form encoding while token refresh often uses JSON \u2014\n * ChatGPT/Codex needs BOTH, so the two shapes are separate helpers rather than one\n * guessing wrapper.\n *\n * @param url the request URL\n * @param form the form fields\n * @param headers extra headers\n * @returns the parsed JSON body\n */\nexport async function postForm(\n url: string,\n form: Record<string, string>,\n headers: Record<string, string> = {},\n): Promise<unknown> {\n return request(\n url,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\", ...headers },\n body: new URLSearchParams(form).toString(),\n },\n true,\n );\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAA2B;AAG3B,MAAM,qBAAqB;AAkB3B,eAAe,QAAQ,KAAa,MAAmB,YAAY,OAAyB;AAC1F,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,MAAM,KAAK,EAAE,GAAG,MAAM,QAAQ,YAAY,QAAQ,kBAAkB,EAAE,CAAC;AAAA,EAC1F,SAAS,GAAG;AACV,UAAM,IAAI,2BAAW,WAAW,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC;AAAA,EAC5E;AACA,MAAI,SAAS,WAAW,OAAO,SAAS,WAAW,OAAQ,aAAa,SAAS,WAAW,KAAM;AAChG,UAAM,IAAI,2BAAW,QAAQ,QAAQ,SAAS,MAAM,EAAE;AAAA,EACxD;AACA,MAAI,SAAS,WAAW,KAAK;AAC3B,UAAM,IAAI,2BAAW,cAAc,UAAU;AAAA,EAC/C;AACA,MAAI,CAAC,SAAS,IAAI;AAIhB,UAAM,IAAI,2BAAW,WAAW,QAAQ,SAAS,MAAM,EAAE;AAAA,EAC3D;AACA,MAAI;AACF,WAAO,MAAM,SAAS,KAAK;AAAA,EAC7B,SAAS,GAAG;AACV,UAAM,IAAI,2BAAW,WAAW,iBAAiB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE;AAAA,EAC/F;AACF;AASA,eAAsB,QAAQ,KAAa,SAAmD;AAC5F,SAAO,QAAQ,KAAK,EAAE,QAAQ,CAAC;AACjC;AAUA,eAAsB,SAAS,KAAa,MAAiD;AAC3F,SAAO;AAAA,IACL;AAAA,IACA,EAAE,QAAQ,QAAQ,SAAS,EAAE,gBAAgB,mBAAmB,GAAG,MAAM,KAAK,UAAU,IAAI,EAAE;AAAA,IAC9F;AAAA,EACF;AACF;AAcA,eAAsB,SACpB,KACA,MACA,UAAkC,CAAC,GACjB;AAClB,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,SAAS,EAAE,gBAAgB,qCAAqC,GAAG,QAAQ;AAAA,MAC3E,MAAM,IAAI,gBAAgB,IAAI,EAAE,SAAS;AAAA,IAC3C;AAAA,IACA;AAAA,EACF;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|