iobroker.ai-usage 0.11.0 → 0.12.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 +27 -6
- package/admin/custom/assets/Components-r_4Gj_p1.js +1 -0
- package/admin/custom/assets/ConfigPanel-Frav13lS.js +1 -0
- package/admin/custom/assets/{index-ZAye02dj.js → index-CioiSDp-.js} +1 -1
- package/admin/custom/assets/{mf-entry-bootstrap-0-9a637550.js → mf-entry-bootstrap-0-4db93d0e.js} +1 -1
- package/admin/custom/assets/virtualExposes-qBZHQidU.js +1 -0
- package/admin/custom/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-BImypPv4.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-r7YiP9Gq.js} +1 -1
- package/admin/custom/assets/virtual_mf-exposes-ssr___mfe_internal__AiUsageComponentSet__customComponents_js-2dCGDNAq.js +2 -0
- package/admin/custom/assets/{virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-Bc45Ij-7.js → virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-B7Oxn2nH.js} +2 -2
- package/admin/custom/customComponents.js +1 -1
- package/admin/custom/mf-manifest.json +1 -1
- package/admin/i18n/de.json +13 -2
- package/admin/i18n/en.json +13 -2
- package/admin/i18n/es.json +13 -2
- package/admin/i18n/fr.json +13 -2
- package/admin/i18n/it.json +13 -2
- package/admin/i18n/nl.json +13 -2
- package/admin/i18n/pl.json +13 -2
- package/admin/i18n/pt.json +13 -2
- package/admin/i18n/ru.json +13 -2
- package/admin/i18n/uk.json +13 -2
- package/admin/i18n/zh-cn.json +13 -2
- package/build/lib/http.js +10 -6
- package/build/lib/http.js.map +2 -2
- package/build/lib/poll-engine.js +83 -25
- package/build/lib/poll-engine.js.map +2 -2
- package/build/lib/provider.js +14 -2
- package/build/lib/provider.js.map +2 -2
- package/build/lib/providers/anthropic-api.js +6 -6
- package/build/lib/providers/anthropic-api.js.map +2 -2
- package/build/lib/providers/chatgpt-auth.js +18 -14
- package/build/lib/providers/chatgpt-auth.js.map +2 -2
- package/build/lib/providers/chatgpt-sub.js +14 -15
- package/build/lib/providers/chatgpt-sub.js.map +2 -2
- package/build/lib/providers/claude-auth.js +23 -17
- package/build/lib/providers/claude-auth.js.map +2 -2
- package/build/lib/providers/claude-sub.js +20 -6
- package/build/lib/providers/claude-sub.js.map +2 -2
- package/build/lib/providers/gemini-auth.js +26 -18
- package/build/lib/providers/gemini-auth.js.map +2 -2
- package/build/lib/providers/gemini-sub.js +5 -5
- package/build/lib/providers/gemini-sub.js.map +2 -2
- package/build/lib/providers/openai.js +7 -7
- package/build/lib/providers/openai.js.map +2 -2
- package/build/lib/pure-helpers.js +5 -14
- package/build/lib/pure-helpers.js.map +2 -2
- package/build/lib/sign-in-manager.js +282 -0
- package/build/lib/sign-in-manager.js.map +7 -0
- package/build/lib/sign-in.js +12 -12
- package/build/lib/sign-in.js.map +2 -2
- package/build/lib/snapshot-tree.js +60 -23
- package/build/lib/snapshot-tree.js.map +2 -2
- package/build/lib/totals.js +0 -1
- package/build/lib/totals.js.map +2 -2
- package/build/main.js +136 -340
- package/build/main.js.map +2 -2
- package/io-package.json +25 -18
- package/package.json +11 -6
- package/admin/custom/assets/Components-B5wYN3xM.js +0 -1
- package/admin/custom/assets/ConfigPanel-BHcTwbRF.js +0 -1
- package/admin/custom/assets/virtualExposes-BGw1tATD.js +0 -1
- package/admin/custom/assets/virtual_mf-exposes-ssr___mfe_internal__AiUsageComponentSet__customComponents_js-CMt18wYA.js +0 -2
package/README.md
CHANGED
|
@@ -39,6 +39,8 @@ For details and how to disable it, see the [Sentry plugin documentation](https:/
|
|
|
39
39
|
- ioBroker js-controller >= 7.2.2
|
|
40
40
|
- **ioBroker Admin >= 8.0.11** — the adapter uses the admin's central credential storage
|
|
41
41
|
|
|
42
|
+
> The adapter CANNOT be installed via GitHub: The adapter must be installed via the ioBroker repository (stable or latest).
|
|
43
|
+
|
|
42
44
|
---
|
|
43
45
|
|
|
44
46
|
## Configuration
|
|
@@ -83,14 +85,14 @@ ai-usage.0.
|
|
|
83
85
|
│ ├── info.unreach — account is not delivering (bool) — drives the connection icon
|
|
84
86
|
│ ├── info.error — why there is no data; empty while all is well, "Unknown" while the adapter itself has nothing to report
|
|
85
87
|
│ ├── info.lastUpdate — time of the last successful read
|
|
86
|
-
│ ├── limits.<window>.* — percent
|
|
88
|
+
│ ├── limits.<window>.* — percent, reset time and whether this window is the limit in force
|
|
87
89
|
│ └── credits.* — where the provider reports a balance
|
|
88
90
|
└── <name>-api — one node per key-based account
|
|
89
91
|
├── warning / limitReached — same triggers as above
|
|
90
92
|
├── info.* — same three status states as above
|
|
91
93
|
├── credits.* / costs.* — granted budget and real money
|
|
92
94
|
├── tokens.* — token counters
|
|
93
|
-
└── models.<model>.* — tokens
|
|
95
|
+
└── models.<model>.* — tokens per model, where the report carries them
|
|
94
96
|
```
|
|
95
97
|
|
|
96
98
|
Only what an account's source actually delivers is created — and once created, a datapoint stays:
|
|
@@ -102,6 +104,10 @@ green — the last values stay valid while the adapter waits. A rejected sign-in
|
|
|
102
104
|
switch it off at once, an unreachable service after three attempts, so a hiccup does not make it
|
|
103
105
|
flap. `info.error` names the cause whenever the provider gave one.
|
|
104
106
|
|
|
107
|
+
**Which window is in force** is shown per window: with Claude the provider says so itself, elsewhere it
|
|
108
|
+
is the window that speaks for the account. It tells you what you will run into next — a model window
|
|
109
|
+
can be the one in force while your session and week are nearly empty. It never raises the warning.
|
|
110
|
+
|
|
105
111
|
**Only plan-wide windows raise the warning** — your session and your week — and the message names
|
|
106
112
|
the window it came from. A window belonging to a single model keeps its own datapoints but stays
|
|
107
113
|
out of it: a model you never use can sit at 100 % forever, and an alarm that never clears is worse
|
|
@@ -145,6 +151,25 @@ so instead of pretending to be connected; signing in again is all it takes.
|
|
|
145
151
|
### **WORK IN PROGRESS**
|
|
146
152
|
-->
|
|
147
153
|
|
|
154
|
+
### 0.12.0 (2026-09-06)
|
|
155
|
+
|
|
156
|
+
- Fixed: An account that has not been signed in yet no longer reports a rejected sign-in — no warning, no notification, and the settings page keeps offering the sign-in button
|
|
157
|
+
- Fixed: An account whose API key is missing or unreadable is now shown as not delivering, instead of leaving its old values standing as though they were current
|
|
158
|
+
- Fixed: An answer arriving while the adapter shuts down can no longer mark an account as online again after the shutdown wrote it offline
|
|
159
|
+
- Fixed: A throttled account counts as delivering everywhere now — the connection icon and the "reachable accounts" total no longer contradict each other
|
|
160
|
+
- Fixed: A limit the provider reports as empty is no longer shown as 0 % used, and a Google quota without a value no longer reads as completely used up
|
|
161
|
+
- Fixed: A rejected ChatGPT sign-in now says so at once instead of leaving you waiting for a quarter of an hour, and a Google account keeps delivering when one route is unavailable
|
|
162
|
+
- Fixed: A Google account without an AI subscription says so, instead of asking for a sign-in that cannot change the answer
|
|
163
|
+
- New: Every limit window shows whether it is the limit currently in force — with Claude the provider states it, elsewhere it is the window that speaks for the account
|
|
164
|
+
- Improved: An account is reported as at its limit when the provider says the window is closed, not only when the percentage happens to reach 100
|
|
165
|
+
- Improved: A window's reset time is written to the minute, so a recording of it no longer gains an entry on every single query, only on real changes
|
|
166
|
+
- Improved: An account that is delivering again says so in the log, instead of leaving the warning about its outage standing as the last word on it
|
|
167
|
+
- Improved: The settings page no longer asks the adapter for every status every four seconds — the values now arrive on their own as they change
|
|
168
|
+
- Changed: "Balance sufficient for calls" now sits under credits, where it belongs; the datapoint at the old place is removed automatically
|
|
169
|
+
- Changed: Each account node shows the readable provider name instead of the internal one — "Claude Max (Claude)" instead of "Claude Max (claude-sub)"
|
|
170
|
+
- Fixed: A per-model folder is now named in your ioBroker language as well, instead of carrying the provider's bare model identifier as its only name
|
|
171
|
+
- New: The datapoints whose meaning is not obvious from their name now carry a short explanation in eleven languages, shown in the object tree
|
|
172
|
+
|
|
148
173
|
### 0.11.0 (2026-09-05)
|
|
149
174
|
|
|
150
175
|
- Fixed: Signing in from the instance settings works again — a leftover setting from an earlier version had silently closed the adapter's message channel, so none of the three flows reached it
|
|
@@ -174,10 +199,6 @@ so instead of pretending to be connected; signing in again is all it takes.
|
|
|
174
199
|
|
|
175
200
|
- Fixed: Stopping the instance now marks the accounts as offline on installations that were updated too, not only on fresh ones — the previous version left them showing as online
|
|
176
201
|
|
|
177
|
-
### 0.9.1 (2026-08-27)
|
|
178
|
-
|
|
179
|
-
- Changed: While an account has nothing to report — the adapter switched off, or started and not asked yet — the reason now reads "Unknown" instead of a sentence about the adapter
|
|
180
|
-
|
|
181
202
|
[Older changelogs can be found there](CHANGELOG_OLD.md)
|
|
182
203
|
|
|
183
204
|
## Support
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./ConfigPanel-Frav13lS.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=[`en`,`de`,`ru`,`pt`,`nl`,`fr`,`it`,`es`,`pl`,`uk`,`zh-cn`];function w(e){let t=(e||`en`).toLowerCase(),n=t.startsWith(`zh`)?`zh-cn`:t.substring(0,2);return C.includes(n)?n:`en`}var T={"claude-sub":`claude`,"chatgpt-sub":`chatgpt`,"gemini-sub":`gemini`};function E(e,t){let n=T[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 D(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 O=[{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 k(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 A=[{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 j(e,t){return e.find(e=>e.provider===t)}function M(e,t,n,r){let i=e.filter(e=>e.provider!==t);return n?[...i,{name:r,provider:t,credentialId:``,warnThreshold:80}]:i}function N(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 P(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 F=``,I=4e3,L=3e4,R=class extends e{constructor(e){super(e),g(this,`timer`,null),g(this,`subscribed`,[]),g(this,`unmounted`,!1),g(this,`onStateChange`,(e,t)=>{if(this.unmounted||!t||t.val===null||t.val===void 0)return;let n=e.split(`.`),r=`${n[2]}.${n[n.length-1]}`;this.setState(e=>({serviceState:{...e.serviceState,[r]:t.val}}))}),this.state={...this.state,credentials:[],credentialsLoaded:!1,signIn:{},drafts:{},providerChoice:{},serviceState:{},busy:``}}async componentDidMount(){var e;(e=super.componentDidMount)==null||e.call(this),await Promise.all([this.loadCredentials(),this.refreshSignIn(),this.syncSubscriptions()]),this.scheduleSignInPoll()}componentDidUpdate(){this.syncSubscriptions()}componentWillUnmount(){var e;this.unmounted=!0,this.timer&&=(clearTimeout(this.timer),null),this.unsubscribeAll(),(e=super.componentWillUnmount)==null||e.call(this)}scheduleSignInPoll(){if(this.unmounted)return;let e=Object.values(this.state.signIn).some(e=>(e==null?void 0:e.status)===`awaiting-device`);this.timer=setTimeout(()=>{this.refreshSignIn().then(()=>this.scheduleSignInPoll())},e?I:L)}async syncSubscriptions(){let e=this.props.oContext,t=[];for(let n of this.accounts()){let r=E(n.provider,n.credentialId);r&&(t.push(`${e.adapterName}.${e.instance}.${r}.info.unreach`),t.push(`${e.adapterName}.${e.instance}.${r}.info.error`))}if(!(t.length===this.subscribed.length&&t.every(e=>this.subscribed.includes(e)))&&(this.unsubscribeAll(),this.subscribed=t,t.length!==0))try{await e.socket.subscribeState(t,this.onStateChange)}catch{}}unsubscribeAll(){this.subscribed.length>0&&(this.props.oContext.socket.unsubscribeState(this.subscribed,this.onStateChange),this.subscribed=[])}async loadCredentials(){try{let e=await this.props.oContext.socket.getObjectViewSystem(`config`,`system.credentials.`,`system.credentials.${F}`),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})}}renderServiceBadge(e,t){let n=E(e,t),r=D(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=await Promise.all(O.filter(e=>j(this.accounts(),e.provider)).map(async e=>({provider:e.provider,answer:await this.ask(`signInStatus`,e.provider)})));this.setState(t=>{let n={...t.signIn};for(let{provider:t,answer:r}of e)r&&(n[t]=r);return{signIn:n}})}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.error}:i:null}catch{return null}}async run(e,t,n){this.setState({busy:t});let r=await this.ask(e,t,n)??{status:`failed`,reason:v.t(`aiu_noAnswer`)};this.setState(e=>({busy:``,signIn:{...e.signIn,[t]:r},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(P(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=j(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(M(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=k(e.suffix,e.name),p=(s==null?void 0:s.provider)||(f==null?void 0:f.provider)||this.state.providerChoice[e.id]||``,m=((n=A.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:A.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(N(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`)}),O.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{w as n,R as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-Bc45Ij-7.js";import"./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-BImypPv4.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{n as u,t as d}from"./ConfigPanel-BHcTwbRF.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 f={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`},p={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`},m={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:`Не в сети`},h={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`},g={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`},_={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`},v={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`},y={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`},b={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`},x={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:`Не в мережі`},S={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:`离线`},C=class extends t{constructor(e){super(e,{...e}),this.state={...this.state,data:{accounts:[]},originalData:{accounts:[]},theme:this.createTheme()};let t={en:f,de:p,ru:m,pt:h,nl:g,fr:_,it:v,es:y,pl:b,uk:x,"zh-cn":S};for(let[e,n]of Object.entries(t))o.extendTranslations(n,e);o.setLanguage(u(navigator.language))}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(d,{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 w=document.getElementById(`root`);w&&l(w).render(r(i.StrictMode,{children:r(C,{socket:{port:8081}})}));
|
|
1
|
+
import"./virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-B7Oxn2nH.js";import"./virtual_mf-REMOTE_ENTRY_ID___mfe_internal__AiUsageComponentSet__customComponents_js-r7YiP9Gq.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{n as u,t as d}from"./ConfigPanel-Frav13lS.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 f={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`},p={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`},m={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:`Не в сети`},h={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`},g={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`},_={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`},v={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`},y={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`},b={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`},x={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:`Не в мережі`},S={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:`离线`},C=class extends t{constructor(e){super(e,{...e}),this.state={...this.state,data:{accounts:[]},originalData:{accounts:[]},theme:this.createTheme()};let t={en:f,de:p,ru:m,pt:h,nl:g,fr:_,it:v,es:y,pl:b,uk:x,"zh-cn":S};for(let[e,n]of Object.entries(t))o.extendTranslations(n,e);o.setLanguage(u(navigator.language))}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(d,{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 w=document.getElementById(`root`);w&&l(w).render(r(i.StrictMode,{children:r(C,{socket:{port:8081}})}));
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{t as e}from"./virtual_mf-exposes___mfe_internal__AiUsageComponentSet__customComponents_js-B7Oxn2nH.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-BGw1tATD.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-qBZHQidU.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-r_4Gj_p1.js","./ConfigPanel-Frav13lS.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-r_4Gj_p1.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-r_4Gj_p1.js","./ConfigPanel-Frav13lS.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-r_4Gj_p1.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-r7YiP9Gq.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-r_4Gj_p1.js"]},"css":{"async":[],"sync":[]}},"path":"./Components"}]}
|
package/admin/i18n/de.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"settingsHeader": "Einstellungen",
|
|
3
3
|
"label_pollInterval": "Abfrage-Intervall (s)",
|
|
4
|
-
"help_pollInterval": "Wie oft jedes Konto abgefragt wird.
|
|
4
|
+
"help_pollInterval": "Wie oft jedes Konto abgefragt wird. Die Untergrenze von 60 s hält die Anbieter davon ab, zu drosseln; 300 s reichen für Fenster, die sich über Stunden bewegen.",
|
|
5
5
|
"label_notifications": "Benachrichtigungen",
|
|
6
6
|
"help_notifications": "Eine Benachrichtigung, wenn ein Konto seine Warnschwelle überschreitet oder die Zugangsdaten nicht mehr funktionieren.",
|
|
7
7
|
"supportHeader": "Entwicklung unterstützen",
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"nameLimits": "Limit-Fenster",
|
|
31
31
|
"nameWindowPercent": "%s verbraucht",
|
|
32
32
|
"nameWindowResetAt": "%s wird zurückgesetzt am",
|
|
33
|
+
"nameWindowActive": "%s ist gerade das gültige Limit",
|
|
33
34
|
"nameCredits": "Guthaben",
|
|
34
35
|
"nameCreditsUsed": "Guthaben verbraucht",
|
|
35
36
|
"nameCreditsLimit": "Guthaben-Grenze",
|
|
@@ -48,6 +49,7 @@
|
|
|
48
49
|
"nameTokensInput": "Eingabe-Token heute",
|
|
49
50
|
"nameTokensOutput": "Ausgabe-Token heute",
|
|
50
51
|
"nameModels": "Verbrauch je Modell",
|
|
52
|
+
"nameModel": "Modell %s",
|
|
51
53
|
"nameModelTokens": "%s Token heute",
|
|
52
54
|
"nameModelCosts": "%s Kosten heute",
|
|
53
55
|
"nameAvailable": "Guthaben reicht für Anfragen",
|
|
@@ -56,5 +58,14 @@
|
|
|
56
58
|
"nameWindowWeekShort": "Woche",
|
|
57
59
|
"nameWindowModelWeek": "Woche (%s)",
|
|
58
60
|
"nameWindowQuota": "Kontingent %s",
|
|
59
|
-
"nameWindowOther": "Limit: %s"
|
|
61
|
+
"nameWindowOther": "Limit: %s",
|
|
62
|
+
"descUnreach": "Wahr, solange dieses Konto keine Daten liefert. Eine Drosselung hält die letzten Werte und lässt es falsch.",
|
|
63
|
+
"descLastError": "Warum dieses Konto nichts liefert. Leer, solange alles läuft; „Unknown\", solange der Adapter selbst nichts zu melden hat.",
|
|
64
|
+
"descWarning": "Wahr, solange ein plan-weites Fenster über der Warnschwelle dieses Kontos liegt. Das Fenster eines einzelnen Modells löst es nie aus.",
|
|
65
|
+
"descLimitReached": "Wahr, wenn ein plan-weites Fenster bei 100 % steht oder der Anbieter es als gesperrt meldet. Ein einzelnes Modell am Anschlag zählt nicht.",
|
|
66
|
+
"descWindowActive": "Wahr, solange dieses Fenster das Limit ist, an das das Konto als Nächstes stößt. Genau ein Fenster je Konto trägt es.",
|
|
67
|
+
"descWindowResetAt": "Wann dieses Fenster von vorn beginnt. Leer, solange kein Fenster läuft — der Anbieter meldet dann keinen Zeitpunkt.",
|
|
68
|
+
"descResetCredits": "Käufliche Gutscheine, die ein volles Limit-Fenster zurücksetzen. Aus der Liste des Anbieters gezählt, abgelaufene bleiben draußen.",
|
|
69
|
+
"descCostsProjected": "Hochgerechnete Ausgaben zum Monatsende, aus dem bisher Ausgegebenen berechnet — keine Zahl des Anbieters.",
|
|
70
|
+
"descTotalMaxPercent": "Das vollste Konto: sein plan-weites Fenster oder sein Restguthaben, je nachdem, was höher liegt."
|
|
60
71
|
}
|
package/admin/i18n/en.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"settingsHeader": "Settings",
|
|
3
3
|
"label_pollInterval": "Poll interval (s)",
|
|
4
|
-
"help_pollInterval": "How often each account is queried.
|
|
4
|
+
"help_pollInterval": "How often each account is queried. The floor of 60 s keeps the providers from throttling you; 300 s is plenty for windows that move in hours.",
|
|
5
5
|
"label_notifications": "Notifications",
|
|
6
6
|
"help_notifications": "One notification when an account crosses its warn threshold or its credentials stop working.",
|
|
7
7
|
"supportHeader": "Support the development",
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"nameLimits": "Limit windows",
|
|
31
31
|
"nameWindowPercent": "%s used",
|
|
32
32
|
"nameWindowResetAt": "%s resets at",
|
|
33
|
+
"nameWindowActive": "%s is the limit in force",
|
|
33
34
|
"nameCredits": "Credits",
|
|
34
35
|
"nameCreditsUsed": "Credits used",
|
|
35
36
|
"nameCreditsLimit": "Credits limit",
|
|
@@ -48,6 +49,7 @@
|
|
|
48
49
|
"nameTokensInput": "Input tokens today",
|
|
49
50
|
"nameTokensOutput": "Output tokens today",
|
|
50
51
|
"nameModels": "Per-model usage",
|
|
52
|
+
"nameModel": "Model %s",
|
|
51
53
|
"nameModelTokens": "%s tokens today",
|
|
52
54
|
"nameModelCosts": "%s costs today",
|
|
53
55
|
"nameAvailable": "Balance sufficient for calls",
|
|
@@ -56,5 +58,14 @@
|
|
|
56
58
|
"nameWindowWeekShort": "Week",
|
|
57
59
|
"nameWindowModelWeek": "Week (%s)",
|
|
58
60
|
"nameWindowQuota": "%s quota",
|
|
59
|
-
"nameWindowOther": "Limit: %s"
|
|
61
|
+
"nameWindowOther": "Limit: %s",
|
|
62
|
+
"descUnreach": "True while this account is not delivering data. A throttle keeps the last values and leaves it false.",
|
|
63
|
+
"descLastError": "Why this account delivers nothing. Empty while all is well; \"Unknown\" while the adapter itself has nothing to report.",
|
|
64
|
+
"descWarning": "True while a plan-wide window is above the warn threshold of this account. A single model's window never raises it.",
|
|
65
|
+
"descLimitReached": "True when a plan-wide window is at 100 % or the provider reports it as locked. A single model at its cap does not count.",
|
|
66
|
+
"descWindowActive": "True while this window is the limit the account runs into next. Exactly one window per account carries it.",
|
|
67
|
+
"descWindowResetAt": "When this window starts over. Empty while no window is running — the provider reports no reset time then.",
|
|
68
|
+
"descResetCredits": "Purchasable vouchers that clear a full limit window. Counted from the provider's list, expired ones left out.",
|
|
69
|
+
"descCostsProjected": "Projected spend at month end, computed from what was spent so far — not a figure the provider reports.",
|
|
70
|
+
"descTotalMaxPercent": "The fullest account: its plan-wide window or its remaining budget, whichever is higher."
|
|
60
71
|
}
|
package/admin/i18n/es.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"settingsHeader": "Ajustes",
|
|
3
3
|
"label_pollInterval": "Intervalo de sondeo (s)",
|
|
4
|
-
"help_pollInterval": "Con qué frecuencia se consulta cada cuenta.
|
|
4
|
+
"help_pollInterval": "Con qué frecuencia se consulta cada cuenta. El mínimo de 60 s evita que los proveedores limiten; 300 s bastan para ventanas que cambian a lo largo de horas.",
|
|
5
5
|
"label_notifications": "Notificaciones",
|
|
6
6
|
"help_notifications": "Una notificación cuando una cuenta supera su umbral de aviso o las credenciales dejan de funcionar.",
|
|
7
7
|
"supportHeader": "Apoyar el desarrollo",
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"nameLimits": "Ventanas de límite",
|
|
31
31
|
"nameWindowPercent": "%s utilizado",
|
|
32
32
|
"nameWindowResetAt": "%s se reinicia el",
|
|
33
|
+
"nameWindowActive": "%s es el límite vigente",
|
|
33
34
|
"nameCredits": "Créditos",
|
|
34
35
|
"nameCreditsUsed": "Créditos utilizados",
|
|
35
36
|
"nameCreditsLimit": "Límite de créditos",
|
|
@@ -48,6 +49,7 @@
|
|
|
48
49
|
"nameTokensInput": "Tokens de entrada de hoy",
|
|
49
50
|
"nameTokensOutput": "Tokens de salida de hoy",
|
|
50
51
|
"nameModels": "Uso por modelo",
|
|
52
|
+
"nameModel": "Modelo %s",
|
|
51
53
|
"nameModelTokens": "%s tokens de hoy",
|
|
52
54
|
"nameModelCosts": "%s costes de hoy",
|
|
53
55
|
"nameAvailable": "Saldo suficiente para las llamadas",
|
|
@@ -56,5 +58,14 @@
|
|
|
56
58
|
"nameWindowWeekShort": "Semana",
|
|
57
59
|
"nameWindowModelWeek": "Semana (%s)",
|
|
58
60
|
"nameWindowQuota": "Cuota de %s",
|
|
59
|
-
"nameWindowOther": "Límite: %s"
|
|
61
|
+
"nameWindowOther": "Límite: %s",
|
|
62
|
+
"descUnreach": "Verdadero mientras esta cuenta no entrega datos. Una limitación mantiene los últimos valores y lo deja falso.",
|
|
63
|
+
"descLastError": "Por qué esta cuenta no entrega nada. Vacío mientras todo va bien; \"Unknown\" mientras el adaptador no tiene nada que informar.",
|
|
64
|
+
"descWarning": "Verdadero mientras una ventana del plan supere el umbral de aviso de esta cuenta. La ventana de un solo modelo nunca lo activa.",
|
|
65
|
+
"descLimitReached": "Verdadero cuando una ventana del plan está al 100 % o el proveedor la declara bloqueada. Un solo modelo en su tope no cuenta.",
|
|
66
|
+
"descWindowActive": "Verdadero mientras esta ventana sea el límite con el que la cuenta topará primero. Exactamente una ventana por cuenta.",
|
|
67
|
+
"descWindowResetAt": "Cuándo vuelve a empezar esta ventana. Vacío mientras no hay ventana en curso — el proveedor no indica entonces una hora.",
|
|
68
|
+
"descResetCredits": "Vales comprables que reinician una ventana de límite llena. Contados desde la lista del proveedor, los caducados quedan fuera.",
|
|
69
|
+
"descCostsProjected": "Gasto proyectado a fin de mes, calculado a partir de lo ya gastado — no es una cifra del proveedor.",
|
|
70
|
+
"descTotalMaxPercent": "La cuenta más llena: su ventana del plan o su presupuesto restante, lo que sea mayor."
|
|
60
71
|
}
|
package/admin/i18n/fr.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"settingsHeader": "Paramètres",
|
|
3
3
|
"label_pollInterval": "Intervalle d'interrogation (s)",
|
|
4
|
-
"help_pollInterval": "
|
|
4
|
+
"help_pollInterval": "À quelle fréquence chaque compte est interrogé. Le minimum de 60 s évite la limitation par les fournisseurs ; 300 s suffisent pour des fenêtres qui évoluent sur des heures.",
|
|
5
5
|
"label_notifications": "Notifications",
|
|
6
6
|
"help_notifications": "Une notification lorsqu'un compte dépasse son seuil d'alerte ou que les identifiants ne fonctionnent plus.",
|
|
7
7
|
"supportHeader": "Soutenir le développement",
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"nameLimits": "Fenêtres de limite",
|
|
31
31
|
"nameWindowPercent": "%s utilisé",
|
|
32
32
|
"nameWindowResetAt": "%s est réinitialisé le",
|
|
33
|
+
"nameWindowActive": "%s est la limite en vigueur",
|
|
33
34
|
"nameCredits": "Crédits",
|
|
34
35
|
"nameCreditsUsed": "Crédits utilisés",
|
|
35
36
|
"nameCreditsLimit": "Limite de crédits",
|
|
@@ -48,6 +49,7 @@
|
|
|
48
49
|
"nameTokensInput": "Jetons d'entrée aujourd'hui",
|
|
49
50
|
"nameTokensOutput": "Jetons de sortie aujourd'hui",
|
|
50
51
|
"nameModels": "Utilisation par modèle",
|
|
52
|
+
"nameModel": "Modèle %s",
|
|
51
53
|
"nameModelTokens": "%s jetons aujourd'hui",
|
|
52
54
|
"nameModelCosts": "%s coûts aujourd'hui",
|
|
53
55
|
"nameAvailable": "Solde suffisant pour les appels",
|
|
@@ -56,5 +58,14 @@
|
|
|
56
58
|
"nameWindowWeekShort": "Semaine",
|
|
57
59
|
"nameWindowModelWeek": "Semaine (%s)",
|
|
58
60
|
"nameWindowQuota": "Quota %s",
|
|
59
|
-
"nameWindowOther": "Limite : %s"
|
|
61
|
+
"nameWindowOther": "Limite : %s",
|
|
62
|
+
"descUnreach": "Vrai tant que ce compte ne fournit pas de données. Une limitation conserve les dernières valeurs et le laisse faux.",
|
|
63
|
+
"descLastError": "Pourquoi ce compte ne fournit rien. Vide tant que tout va bien ; « Unknown » tant que l'adaptateur n'a rien à signaler.",
|
|
64
|
+
"descWarning": "Vrai tant qu'une fenêtre du forfait dépasse le seuil d'alerte de ce compte. La fenêtre d'un seul modèle ne le déclenche jamais.",
|
|
65
|
+
"descLimitReached": "Vrai lorsqu'une fenêtre du forfait atteint 100 % ou que le fournisseur la déclare bloquée. Un seul modèle à sa limite ne compte pas.",
|
|
66
|
+
"descWindowActive": "Vrai tant que cette fenêtre est la limite que le compte atteindra en premier. Exactement une fenêtre par compte.",
|
|
67
|
+
"descWindowResetAt": "Quand cette fenêtre recommence. Vide tant qu'aucune fenêtre n'est en cours — le fournisseur n'indique alors aucune heure.",
|
|
68
|
+
"descResetCredits": "Bons achetables qui réinitialisent une fenêtre de limite pleine. Comptés depuis la liste du fournisseur, les expirés exclus.",
|
|
69
|
+
"descCostsProjected": "Dépense projetée en fin de mois, calculée à partir du montant déjà dépensé — ce n'est pas un chiffre du fournisseur.",
|
|
70
|
+
"descTotalMaxPercent": "Le compte le plus rempli : sa fenêtre de forfait ou son budget restant, selon ce qui est le plus élevé."
|
|
60
71
|
}
|
package/admin/i18n/it.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"settingsHeader": "Impostazioni",
|
|
3
3
|
"label_pollInterval": "Intervallo di polling (s)",
|
|
4
|
-
"help_pollInterval": "
|
|
4
|
+
"help_pollInterval": "Con quale frequenza viene interrogato ogni account. Il minimo di 60 s evita il throttling dei provider; 300 s bastano per finestre che cambiano nell'arco di ore.",
|
|
5
5
|
"label_notifications": "Notifiche",
|
|
6
6
|
"help_notifications": "Una notifica quando un account supera la soglia di avviso o le credenziali smettono di funzionare.",
|
|
7
7
|
"supportHeader": "Sostieni lo sviluppo",
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
"nameLimits": "Finestre di limite",
|
|
31
31
|
"nameWindowPercent": "%s utilizzato",
|
|
32
32
|
"nameWindowResetAt": "%s si azzera il",
|
|
33
|
+
"nameWindowActive": "%s è il limite in vigore",
|
|
33
34
|
"nameCredits": "Crediti",
|
|
34
35
|
"nameCreditsUsed": "Crediti utilizzati",
|
|
35
36
|
"nameCreditsLimit": "Limite di crediti",
|
|
@@ -48,6 +49,7 @@
|
|
|
48
49
|
"nameTokensInput": "Token di input di oggi",
|
|
49
50
|
"nameTokensOutput": "Token di output di oggi",
|
|
50
51
|
"nameModels": "Utilizzo per modello",
|
|
52
|
+
"nameModel": "Modello %s",
|
|
51
53
|
"nameModelTokens": "%s token di oggi",
|
|
52
54
|
"nameModelCosts": "%s costi di oggi",
|
|
53
55
|
"nameAvailable": "Saldo sufficiente per le chiamate",
|
|
@@ -56,5 +58,14 @@
|
|
|
56
58
|
"nameWindowWeekShort": "Settimana",
|
|
57
59
|
"nameWindowModelWeek": "Settimana (%s)",
|
|
58
60
|
"nameWindowQuota": "Quota %s",
|
|
59
|
-
"nameWindowOther": "Limite: %s"
|
|
61
|
+
"nameWindowOther": "Limite: %s",
|
|
62
|
+
"descUnreach": "Vero finché questo account non fornisce dati. Una limitazione mantiene gli ultimi valori e lo lascia falso.",
|
|
63
|
+
"descLastError": "Perché questo account non fornisce nulla. Vuoto finché tutto funziona; \"Unknown\" finché l'adapter non ha nulla da segnalare.",
|
|
64
|
+
"descWarning": "Vero finché una finestra dell'intero piano supera la soglia di avviso di questo account. La finestra di un singolo modello non lo attiva mai.",
|
|
65
|
+
"descLimitReached": "Vero quando una finestra dell'intero piano è al 100 % o il provider la segnala bloccata. Un singolo modello al limite non conta.",
|
|
66
|
+
"descWindowActive": "Vero finché questa finestra è il limite che l'account incontra per primo. Esattamente una finestra per account.",
|
|
67
|
+
"descWindowResetAt": "Quando questa finestra riparte. Vuoto finché nessuna finestra è in corso — il provider non indica allora un orario.",
|
|
68
|
+
"descResetCredits": "Buoni acquistabili che azzerano una finestra di limite piena. Contati dall'elenco del provider, quelli scaduti esclusi.",
|
|
69
|
+
"descCostsProjected": "Spesa prevista a fine mese, calcolata da quanto speso finora — non è un dato del provider.",
|
|
70
|
+
"descTotalMaxPercent": "L'account più pieno: la sua finestra di piano o il budget residuo, a seconda di quale sia maggiore."
|
|
60
71
|
}
|